我视图中不存在的属性的ModelState验证错误

时间:2011-10-21 02:48:09

标签: asp.net-mvc-3 razor html-helper

假设这个观点:

@Html.HiddenFor(model => model.Batiment.Client.Id)

@Html.LabelFor(model => model.Batiment.Code)</td>
@Html.EditorFor(model => model.Batiment.Code)</td>
<br>
@Html.LabelFor(model => model.Batiment.Nom)</td>
@Html.EditorFor(model => model.Batiment.Nom)</td>

当我在控制器上提交表单时,ModelState对于我的类Client中所需的属性“Nom”无效。是的,我的类Client中的元数据设置为必需,但我不将此字段包含在我的视图中......!为什么Mvc会引发这个错误?

我可以隐藏字段(例如Id)而不在我的视图中指定所有必填字段吗?

2 个答案:

答案 0 :(得分:1)

错误在绑定期间进入模型状态,因此您可以通过在操作方法签名中包含以下内容来排除绑定属性:

public ActionResult Register([Bind(Exclude="PropertyName")] UserViewModel user)
{
   // Your logic here
}

这应该将PropertyName排除在绑定之外,因此错误不会进入您的模型状态,您的验证应该会成功。只是补充一点,我认为这更像是一个黑客,而不是解决方案。如果您只需要视图模型的一部分,则不应使用此视图模型,您应该考虑创建没有此属性的新视图模型。

它可能看起来非常相似,看起来像是重复的代码,但事实并非如此。它促进了关注点的分离,在扩展/修改应用程序时,您应该看到在不久的将来这样做的好处。

答案 1 :(得分:0)

不,验证是在模型上完成的,而不是视图,为什么它被称为'模型状态' 您需要为此方案创建另一个视图。这完全是ViewModels的用途。 然后,您可以使用AutoMapper之类的工具轻松地将此视图模型之间的属性复制到基础模型。