MVC4 Formcollection不爽快?

时间:2013-06-07 11:47:20

标签: c# asp.net-mvc-4 razor

我有一个带有布尔属性的模型。相应的视图如下所示:

@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',并发生异常。

表单是否必须以某种方式清除?

1 个答案:

答案 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。从代码中删除它。只需将模型作为参数传递给动作,模型绑定器将处理其余部分。