是否可以在生成自定义 Blazor 组件时使组件参数成为必需参数?



当我尝试生成 Blazor 组件时,我可以像这样为它定义参数:

@code {
[Parameter]
public string MyString { get; set; }
}

我的问题是,我是否可以将此参数设置为必需参数,以便在使用组件时,除非我提供指定的参数,否则不会生成项目?这是我应该担心的事情吗?我想我可以处理组件初始化中的任何无效值,如果值没有像这样提供,可能会抛出异常:

protected override void OnInitialized()
{
base.OnInitialized();
if (string.IsNullOrWhiteSpace(MyString)) {
// throw an exception here...
}
}

但这是处理这个问题的正确方法吗?

.NET 6 及更高

版本这可以通过[EditorRequired]属性来实现。例:

[Parameter, EditorRequired]
public string Name { get; set; }

这将向组件的使用者发出 IDE 警告,指出如果未提供参数,则缺少参数。

在 .NET 6 之前

目前,您必须完全按照您所说的进行操作。

我喜欢将[EditorRequired]与初始值null!结合起来。

[Parameter, EditorRequired]
public string MyString { get; set; } = null!;

从技术上讲,该值在运行OnInitialized()之前将为 null,例如在构造函数中。不过,这比在其他任何地方将其视为可能为空更方便。

还没有,没有。您目前能做的最好的事情就是在SetParametersAsync中抛出异常。

Blazor 大学上有一节介绍可选路由参数,介绍如何检查参数是否已传递。您只需将其设置为可为空并检查它是否为空即可。 https://blazor-university.com/routing/optional-route-parameters/

或者,如果 overrideSetParametersAsync传递了ParameterView parameters参数,则可以使用parameters.TryGetValue来确定是否传递了参数,如果未传递,则引发异常。

但目前没有办法导致编译时错误。

正如@BenSampica所说,必须等到 .NET 6 才能做到这一点,但您可以使用

[Parameter]
public string MyString { get; set; } = null!;

目前。不会生成编译器错误,但也不会让您使用它。

我们发现,将其添加到.csproj允许我们将警告视为构建错误。

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<!-- Violations of EditorRequired (RZ2012) are turned into true errors -->
<!-- https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/errors-warnings -->
<WarningsAsErrors>RZ2012</WarningsAsErrors>
</PropertyGroup>

最新更新