为什么 Blazor 假定可为空的组件参数为非空?
Why does Blazor assume a nullable component parameter is non-null?
我应该如何将可为 null 的值传递到 Blazor 组件中?目前我在构建期间遇到错误,抱怨我的值不能为空,但组件参数设置为 int?
.
组件库:
public class ProjectNameInputBase : ComponentBase
{
private string[] _existingProjectNames = new string[0];
private bool _loaded;
[Parameter]
public int? CompanyId { get; set; }
[Parameter]
public string ProjectName { get; set; }
[Parameter]
public EventCallback<string> ProjectNameChanged { get; set; }
protected bool Disabled => _loaded;
protected string[] Errors =>
_existingProjectNames
.Where(name => AreNamesEqual(name, ProjectName))
.Select(name => $"Project with name \"{name}\" already exists in the company")
.ToArray();
protected async override Task OnParametersSetAsync()
{
if (CompanyId.HasValue)
{
_existingProjectNames = await FetchProjectNamesAsync(CompanyId.Value);
_loaded = true;
}
}
protected async Task HandleProjectNameChanged(ChangeEventArgs e)
{
if (ProjectNameChanged.HasDelegate)
{
await ProjectNameChanged.InvokeAsync(e.Value as string);
}
}
private static bool AreNamesEqual(string a, string b) => a.Trim().ToLower() == b.Trim().ToLower();
private async Task<string[]> FetchProjectNamesAsync(int companyId)
{
await Task.Delay(500);
return new[] {
"Project 1",
"Project 2",
"Project 3"
};
}
}
组件:
@inherits ProjectNameInputBase
<input type="text" value="@ProjectName" @onchange="@HandleProjectNameChanged" disabled="@Disabled" />
@foreach (var error in Errors)
{
<small class="error">@error</small>
}
消费组件:
<label>
Project Name
<ProjectNameInput CompanyId="@Company?.Id" @bind-ProjectName="@ProjectName" />
</label>
截图:
无复现,使用 .net 5。
您使用的是旧版本,或者您缺少(拼写错误)@ProjectName 或其他元素。还有其他错误吗?您强调的错误可能是附带损害。
无法在其他机器上重现。我的 visual studio 实例似乎存在问题。完全相同的代码在另一台机器上运行。
这是IDE的错。只需关闭 Visual Studio。再次打开后。会好的。
我应该如何将可为 null 的值传递到 Blazor 组件中?目前我在构建期间遇到错误,抱怨我的值不能为空,但组件参数设置为 int?
.
组件库:
public class ProjectNameInputBase : ComponentBase
{
private string[] _existingProjectNames = new string[0];
private bool _loaded;
[Parameter]
public int? CompanyId { get; set; }
[Parameter]
public string ProjectName { get; set; }
[Parameter]
public EventCallback<string> ProjectNameChanged { get; set; }
protected bool Disabled => _loaded;
protected string[] Errors =>
_existingProjectNames
.Where(name => AreNamesEqual(name, ProjectName))
.Select(name => $"Project with name \"{name}\" already exists in the company")
.ToArray();
protected async override Task OnParametersSetAsync()
{
if (CompanyId.HasValue)
{
_existingProjectNames = await FetchProjectNamesAsync(CompanyId.Value);
_loaded = true;
}
}
protected async Task HandleProjectNameChanged(ChangeEventArgs e)
{
if (ProjectNameChanged.HasDelegate)
{
await ProjectNameChanged.InvokeAsync(e.Value as string);
}
}
private static bool AreNamesEqual(string a, string b) => a.Trim().ToLower() == b.Trim().ToLower();
private async Task<string[]> FetchProjectNamesAsync(int companyId)
{
await Task.Delay(500);
return new[] {
"Project 1",
"Project 2",
"Project 3"
};
}
}
组件:
@inherits ProjectNameInputBase
<input type="text" value="@ProjectName" @onchange="@HandleProjectNameChanged" disabled="@Disabled" />
@foreach (var error in Errors)
{
<small class="error">@error</small>
}
消费组件:
<label>
Project Name
<ProjectNameInput CompanyId="@Company?.Id" @bind-ProjectName="@ProjectName" />
</label>
截图:
无复现,使用 .net 5。
您使用的是旧版本,或者您缺少(拼写错误)@ProjectName 或其他元素。还有其他错误吗?您强调的错误可能是附带损害。
无法在其他机器上重现。我的 visual studio 实例似乎存在问题。完全相同的代码在另一台机器上运行。
这是IDE的错。只需关闭 Visual Studio。再次打开后。会好的。