Minimal API绑定复选框值到复杂类型遇报错,求验证文档正确性
ASP.NET Core表单复选框绑定布尔属性报错的原因与解决
问题详情
按官方文档的表单绑定说明,尝试将表单复选框值绑定到Todo类的IsCompleted布尔属性时,运行抛出错误:
BadHttpRequestException: The value 'on' is not valid for 'IsCompleted'.
Todo类代码如下:
class Todo { public string Name { get; set; } = string.Empty; public bool IsCompleted { get; set; } = false; public DateTime DueDate { get; set; } = DateTime.Now.Add(TimeSpan.FromDays(1)); }
我怀疑文档存在疏漏,认为需要额外添加app.UseAntiforgery();中间件才能正常工作,提交文档bug前希望得到验证。
验证与解决方案
首先明确:这个报错和UseAntiforgery中间件完全无关,文档没提及它是正确的——CSRF防护逻辑不影响模型绑定的解析规则。
报错的核心原因是:HTML复选框默认选中时提交的是on字符串,但ASP.NET Core的布尔类型绑定仅识别true/false或1/0格式的值,因此无法完成解析。
解决方法有两种,优先选第一种:
- 修改表单复选框的value属性:将复选框的
value设置为true,选中时提交的就是符合绑定要求的true值;未选中时该字段不会被提交,IsCompleted会使用类中定义的默认值false:<input type="checkbox" name="IsCompleted" value="true" /> - 自定义模型绑定(可选):编写自定义绑定器将
on转换为true,但这种方式没必要,调整表单值是更高效的方案。
结论
文档本身没有错误,报错是因为复选框默认提交值不符合ASP.NET Core布尔属性的绑定规则,和UseAntiforgery中间件无关。只需调整表单复选框的value为true即可解决问题。
内容的提问来源于stack exchange,提问作者JensJ
相关产品推荐
相关产品推荐

