ASP.NET MVC 不使用HTML Helper实现Checkbox自定义name及绑定
问题原因说明
@Html.CheckBox方法的第一个参数优先级最高,会直接用于生成name属性,你在匿名类中传入的@name参数会被覆盖,这是ASP.NET MVC HtmlHelper的内置设计,所以无法通过这个方式修改name。- 直接写原生复选框报错的原因是:未勾选的复选框不会被浏览器提交到后端,而MVC的
@Html.CheckBox默认会生成一个同名的隐藏域,值为false,保证不管是否勾选都会提交对应值,你自己写的时候没加这个隐藏域,后端非空bool参数收不到值就会抛出空参数错误。
最优解决方案(完全不影响原有域模型)
步骤1:修改视图代码,写原生复选框补全隐藏域
直接替换原有@Html.CheckBox代码,手动设置name为KYC,同时补全隐藏域避免空参数问题:
<div class="form-check col-md-offset-8" align="center"> <input type="checkbox" name="KYC" id="KYC" /> <input type="hidden" name="KYC" value="false" /> <label class="form-check-label" for="KYC"> KYC Complete ? <button id="Submit">KYC Complete ?</button> </label> </div>
步骤2:修改控制器Post方法的参数名
将Post动作的参数名改为和表单提交的name一致的KYC,内部筛选逻辑完全不用动,不会影响原有域模型:
[HttpPost] public ActionResult Index(bool KYC) { if (KYC) { List<BankAccount> AccKYC = db.BankAccounts.Where(p => p.KYCComplete == true).OrderBy(b => b.City).ToList(); return View(AccKYC); } return RedirectToAction("Index"); }
可选方案:保留原有参数名
如果你不想修改控制器的参数名,也可以通过参数绑定特性指定绑定的表单字段名:
// ASP.NET MVC 5 版本 [HttpPost] public ActionResult Index([Bind(Prefix = "KYC")] bool KYCComplete) { // 原有逻辑不变 } // ASP.NET Core MVC 版本 [HttpPost] public ActionResult Index([FromForm(Name = "KYC")] bool KYCComplete) { // 原有逻辑不变 }
内容的提问来源于stack exchange,提问作者user17291846
相关产品推荐
相关产品推荐

