显示 Blazor InputSelect 中的第一个选项,但值为 null

Posted

技术标签:

【中文标题】显示 Blazor InputSelect 中的第一个选项,但值为 null【英文标题】:First option in Blazor InputSelect displayed but value is null 【发布时间】:2021-03-18 05:20:36 【问题描述】:

我在 Razor 组件中遇到了 InputSelect 元素的奇怪行为。 在我的输入表单上,我有几个与模型(合作伙伴)绑定的字段。我以下拉选择的形式放置了其中一些字段。因为绑定字段的 (PartnerCategory) 值是 id(整数),所以我从数据库中获取一个查找表,其名称对应于选定的 id。

在一个页面上,我可以在下拉列表中看到所有名称。但是当我尝试将记录从表单插入到数据库时,它会引发 SQL 异常,因为 InputSelect 将列表中的第一个值视为 NULL。只是要清楚 - 下拉列表中没有空白值,并且显示了所有名称。它只是将其值设为 NULL。以下是因为数据类型是整数,它将 NULL 转换为零。而且因为我的表中没有 id 为零,所以 Insert 命令失败。

下面是我的简化代码

<EditForm Model="@partner">
    <InputSelect @bind-Value="partner.PartnerCategoryId">
        @if (categoryList != null)
        
            @foreach (var item in categoryList.OrderBy(x => x.PartnerCategoryId))
            
                <option value="@item.PartnerCategoryId">@item.Name</option>
            
        
    </InputSelect>
</EditForm>

@code 
    Partner partner = new Partner();
    private IEnumerable<PartnerCategory> categoryList;

    protected override async Task OnInitializedAsync()
    
        categoryList = await CategoryService.GetAllAsync();
       

我该如何处理?它会在从数据库中获取数据之前将值绑定到模型吗?

【问题讨论】:

【参考方案1】:

要解决此问题,您可以在代码中添加&lt;option value=""&gt;Select...&lt;/option&gt;,如下所示:

 <InputSelect @bind-Value="partner.PartnerCategoryId">
    @if (categoryList != null)
    
        <option value="">Select...</option>
        @foreach (var item in categoryList.OrderBy(x => x.PartnerCategoryId))
        
            <option value="@item.PartnerCategoryId">@item.Name</option>
        
    
</InputSelect>

并在您的 PartnerCategory 模型中根据需要定义 PartnerCategoryId。注意 PartnerCategoryId 的类型可以为空:int?

[Required]
public int? PartnerCategoryId get; set;

这将阻止“提交”您的表单,除非用户选择了一个值

要测试新更改: 将OnValidSubmit 属性添加到您的EditForm 组件并将其值设置为“HandleValidSubmit

添加HandleValidSubmit 方法,如下所示:

private void HandleValidSubmit()

   // Put code here to save your record in the database

在 EditForm 底部添加一个提交按钮:

<p><button type="submit">Submit</button></p>

运行您的应用,然后点击“Submit”按钮...您可以看到表单没有“提交”,并且选择元素的边框被涂成红色。

这是您的代码的完整版本:

<EditForm Model="@partner" OnValidSubmit="HandleValidSubmit">
    <InputSelect @bind-Value="partner.PartnerCategoryId">
        @if (categoryList != null)
        
            <option value="">Select...</option>
            @foreach (var item in categoryList.OrderBy(x => x.PartnerCategoryId))
            
                <option value="@item.PartnerCategoryId">@item.Name</option>
            
        
    </InputSelect>

     <p><button type="submit">Submit</button></p>
</EditForm>

@code 
    Partner partner = new Partner();
    private IEnumerable<PartnerCategory> categoryList;

    protected override async Task OnInitializedAsync()
    
        categoryList = await CategoryService.GetAllAsync();
     

    private void HandleValidSubmit()
    
       Console.WriteLine("Submitted");
      

【讨论】:

忘了在EditForm中添加&lt;DataAnnotationsValidator /&gt;

以上是关于显示 Blazor InputSelect 中的第一个选项,但值为 null的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Blazor 中编写自定义值更改事件处理程序?

在 Blazor 中的文本或数字框中自动突出显示

inputselect默认字体颜色

Blazor 中的递归标记

Blazor 移动开发-起步

未处理的异常 Json 在 Blazor 上显示数据