我有一个带有布尔属性的模型。相应的视图如下所示:
@Html.CheckBoxFor(model => model.TermsAccepted)
@Html.ValidationMessageFor(model => model.TermsAccepted)
在我的控制器中,我执行以下操作:
var validator = new MyModelValidator();
var model = new MyModel()
{
TermsAccepted = bool.Parse(form["TermsAccepted"])
};
var validationResult = validator.Validate(model);
if (!validationResult.IsValid)
foreach (var error in validationResult.Errors)
warnings.Add(error.ErrorMessage);
return warnings;
第一次,我没有点击复选框,因为表单值为'false'并显示验证消息。第二个我点击复选框,但表格值现在是'true,false',并发生异常。
表单是否必须以某种方式清除?
答案 0 :(得分:2)
原因是因为Html.CheckBoxFor助手生成了一个额外的隐藏字段,其名称与复选框的名称相同,值为false。选中该复选框后,将2个值发送到控制器。默认的模型绑定器完全能够理解和解析此值。因此,如果您使用视图模型而不是使用此FormCollection做一些可怕的事情并手动解析它,那么一切都会很好地工作:
[HttpPost]
public ActionResult SomeAction(MyModel model)
{
var validator = new MyModelValidator();
var validationResult = validator.Validate(model);
if (!validationResult.IsValid)
foreach (var error in validationResult.Errors)
warnings.Add(error.ErrorMessage);
...
}
无需使用任何FormCollection。从代码中删除它。只需将模型作为参数传递给动作,模型绑定器将处理其余部分。