You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中BSInput(InputType.Select)变更时未触发Setter问题排查

问题排查与解决方案

1. 类型不匹配导致绑定失效

手动编写<option>时,value默认以字符串形式渲染,而绑定的属性_defaultVendorID是int类型,Blazor无法自动完成字符串到int的转换,导致值变化无法触发setter。

修正方法:
显式指定option的value为int类型:

<BSInput InputType="InputType.Select" @bind-Value="_defaultVendorID">
    <option value="@((int)0)">Please select default vendor</option>
    @foreach (var vendor in _viewModel.registration.Vendors)
    {
        <option value="@vendor.Id">@vendor.VendorName</option>
    }
</BSInput>

2. 未使用BSInput组件的推荐用法

BootstrapBlazor的BSInput作为下拉选择框时,推荐使用Items属性绑定数据源,而非手动遍历生成<option>。手动编写的选项可能无法被组件正确跟踪,导致值变化无法触发绑定更新。

推荐写法:

<BSInput InputType="InputType.Select" 
         @bind-Value="_defaultVendorID"
         Items="@_viewModel.registration.Vendors"
         TextField="@(v => v.VendorName)"
         ValueField="@(v => v.Id)"
         Placeholder="Please select default vendor" />

这种方式会由组件自动处理选项生成、类型匹配和值绑定,确保setter能被正常触发。

3. Setter内部逻辑错误(附带修正)

即使setter触发,当前查询逻辑也无法正确找到选中的供应商:

// 原错误逻辑:用registration的VendorId和选中ID比较
defaultVendor = (from v in _viewModel.registration.Vendors where _viewModel.registration.VendorId == _defaultVendorId select v).FirstOrDefault();

应改为直接匹配供应商的Id:

defaultVendor = _viewModel.registration.Vendors.FirstOrDefault(v => v.Id == _defaultVendorId);

4. 属性命名规范优化(可选)

虽然不是setter不触发的直接原因,但C#中public属性以下划线开头不符合规范,建议调整为:

private int _defaultVendorId = 0;
public int DefaultVendorID
{
    get => _defaultVendorId; 
    set 
    {
        _defaultVendorId = value;
        defaultVendor = _viewModel.registration.Vendors.FirstOrDefault(v => v.Id == _defaultVendorId);
    }
}

绑定部分对应改为@bind-Value="DefaultVendorID",代码更易读且符合规范。

内容的提问来源于stack exchange,提问作者bilpor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:55:19