ASP.NET Core中CheckBox提交表单始终返回false值如何解决
问题根因及解决方案
1. 模型绑定名称不匹配
你使用asp-for="@city.OnHeader"时,ASP.NET Core Tag Helper会自动生成name="city.OnHeader"的复选框字段,而后端Action接收的参数为WeatherModel theWeather,模型绑定默认会寻找前缀为theWeather的对应字段,匹配失败就会赋值默认值false。
可选修复方案二选一:
- 方案1:给后端接收模型加绑定前缀匹配前端生成的字段名
[HttpPost] public IActionResult Update([Bind(Prefix = "city")] WeatherModel theWeather, int cityId) { _weatherService.Update(cityId, theWeather.OnHeader, theWeather.OnProfile); return RedirectToAction("Settings"); }
- 方案2:手动指定前端复选框的name属性,和后端模型属性名对齐
<td><input type="checkbox" name="OnHeader" @(city.OnHeader ? "checked" : "") /></td> <td><input type="checkbox" name="OnProfile" @(city.OnProfile ? "checked" : "") /></td>
2. HTML结构不规范导致表单字段丢失
当前你直接把<tr>标签放在<form>下,不符合HTML规范:<tr>必须作为<table>的子元素使用,结构错误会导致浏览器自动调整DOM结构,把复选框元素移到表单外部,提交时无法携带字段值,永远返回false。
请检查调整HTML结构,确保<form>嵌套在<td>内,或者表单包裹完整的<table>元素。
额外注意
不要手动给复选框设置value="false",ASP.NET Core复选框Tag Helper会默认生成一个同名隐藏域值为false,提交时如果勾选复选框会同时提交true和false两个值,模型绑定会自动取第一个有效值true,手动修改value会破坏该默认逻辑。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

