ASP.NET Core中用asp-for提交复选框却添加false值的问题
你遇到的问题根源在于ASP.NET Core复选框标签助手的默认行为,以及当前绑定逻辑的不匹配:
自动生成的隐藏字段:当用
asp-for="Accepted[i]"绑定布尔类型数组时,标签助手会自动为每个复选框生成对应隐藏输入:<input type="hidden" name="Accepted[i]" value="false">这个字段是为了弥补浏览器的行为缺陷——浏览器不会提交未选中的复选框,添加它能确保未选中时后台模型接收到
false值,而非null。绑定逻辑与value属性冲突:你手动给复选框设置了
value="@info[i].Name"(字符串类型),但绑定的Accepted[i]是布尔类型。当复选框被选中时,浏览器会同时提交两个参数:复选框的Accepted[i]=@info[i].Name和隐藏字段的Accepted[i]=false,这就是多余false条目的来源。而当复选框未选中时,浏览器不提交复选框参数,若页面中Accepted[i]初始值为false,标签助手可能不会生成隐藏字段,所以FormData里无相关条目。
根据你提交选中info名称的需求,推荐以下两种方案:
方案一:绑定到字符串列表(匹配你的FormData期望)
如果后台需要接收选中的info名称列表,直接调整绑定目标为字符串数组/列表,标签助手会自动处理提交逻辑,不会生成多余隐藏字段:
前端代码修改:
<form asp-controller="SomeController" asp-action="SomeAction"> @for(int i = 0; i < info.Length; i++) { <!-- 将asp-for绑定到接收选中名称的列表属性,可改成你期望的"info" --> <input type="checkbox" value="@info[i].Name" asp-for="SelectedInfos" checked /> <strong>@info[i].Name</strong> <br /> } <button type="submit">Some button</button> </form>
后台模型调整:
public class YourViewModel { // 属性名对应asp-for的值,改为"info"即可完全匹配你的期望格式 public List<string> SelectedInfos { get; set; } }
提交后FormData会是:
SelectedInfos[0]: some-data SelectedInfos[1]: another-data
方案二:禁用自动生成的隐藏字段(保留布尔绑定)
如果必须保留Accepted[i]布尔数组的绑定,给复选框添加asp-disable-hidden-input="true"属性,即可阻止标签助手生成多余隐藏字段:
<input type="checkbox" value="@info[i].Name" asp-for="Accepted[i]" checked asp-disable-hidden-input="true" /> <strong>@info[i].Name</strong>
此时,选中的复选框会提交Accepted[i]=@info[i].Name(后台模型绑定会解析为true),未选中的复选框不会提交任何数据,后台Accepted[i]会取默认值false(值类型)或null(可空布尔类型),FormData里不会再出现Accepted[0]:false这类多余条目。
内容的提问来源于stack exchange,提问作者Szyszka947

