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
相关产品推荐
相关产品推荐

