首页 > 解决方案 > 为什么 Blazor 假定可空组件参数不为空?

问题描述

我应该如何将可为空的值传递给 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>

截屏:

可空错误

标签: c#visual-studiorazorblazor

解决方案


没有复制,使用.net 5。

您使用的是旧版本,或者您缺少(拼写错误)@ProjectName 或其他元素。还有其他错误吗?您强调的错误可能是附带损害。


推荐阅读