.NET Core中Radio Button绑定Bool值异常,如何正确创建单选按钮?
解决单选按钮绑定ShipViaDetails.IsDefault属性失败的问题
问题原因
你当前的单选按钮将name设为IsDefault,提交时只会发送选中项的ShipCode字符串,但ASP.NET模型绑定无法将这个字符串自动映射到ShipViaDetails集合中对应实例的布尔类型IsDefault属性,导致赋值失败。
解决方案(推荐方案)
通过单选按钮传递选中的ShipCode,在控制器中手动对应设置IsDefault属性,具体调整如下:
- 修改前端单选按钮代码
将单选按钮的name改为DefaultShipCode,保持value为ShipCode,确保单选按钮组互斥:
<td> <input type="radio" name="DefaultShipCode" value="@svias.ShipViaAccesses[i].ShipCode" @(svias.ShipViaAccesses[i].IsDefault ? "checked" : "") hx-post="@url" hx-trigger="change" hx-target="this" /> </td>
- 控制器中处理赋值逻辑
在接收请求的Action中,通过DefaultShipCode参数找到对应的ShipViaDetails实例,设置其IsDefault为true,其余实例设为false:
[HttpPost] public IActionResult SetDefaultShipVia(string defaultShipCode, List<ShipViaDetails> shipViaAccesses) { foreach (var shipVia in shipViaAccesses) { shipVia.IsDefault = shipVia.ShipCode.Equals(defaultShipCode, StringComparison.OrdinalIgnoreCase); } // 这里添加保存数据等后续逻辑 return Ok(); }
备选方案(直接模型绑定)
如果希望通过模型绑定直接处理,需要保留每个ShipViaDetails实例的字段,配合单选按钮传递选中的ShipCode:
<td> <input type="radio" name="SelectedDefaultShipCode" value="@svias.ShipViaAccesses[i].ShipCode" @(svias.ShipViaAccesses[i].IsDefault ? "checked" : "") hx-post="@url" hx-trigger="change" hx-target="this" /> <!-- 隐藏字段传递实例的其他属性,确保模型绑定能识别集合 --> <input type="hidden" name="ShipViaAccesses[@i].ShipCode" value="@svias.ShipViaAccesses[i].ShipCode" /> <input type="hidden" name="ShipViaAccesses[@i].HasAccess" value="@svias.ShipViaAccesses[i].HasAccess" /> </td>
控制器处理逻辑和推荐方案一致,通过SelectedDefaultShipCode参数遍历集合设置IsDefault。
内容的提问来源于stack exchange,提问作者UTrocket23
相关产品推荐
相关产品推荐

