1

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

@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”并显示了验证消息。第二个我确实单击了复选框,但是表单值现在是“真,假”并且发生了异常。

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

4

1 回答 1

2

这样做的原因是因为 Html.CheckBoxFor 帮助器生成了一个与复选框同名且值为 false 的附加隐藏字段。当复选框被选中时,两个值被发送到控制器。默认模型绑定器完全能够理解和解析这个值。因此,如果您使用视图模型而不是使用此 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。从您的代码中删除它。只需将模型作为参数传递给动作,模型绑定器将负责其余的工作。

于 2013-06-07T11:55:24.847 回答