在控制器方法中重新验证修改后的ViewModel?

Mer*_*nzo 53 asp.net-mvc unobtrusive-validation asp.net-mvc-3 asp.net-mvc-4

编辑 - 我们正在使用MVC4开发预览....

我正在为一个FishingTrip类实现一个编辑页面. FishingTrip包含简单Crew对象的子集合(即FishingTripID,CrewID,CrewPosition).

我正在使用Jarrett Meyer的方法来添加,编辑和删除Crew集合.我正在使用不显眼的验证来指定属性Crew都是Required.

我的问题:当我从列表中逻辑删除一个项目时(按照Jarrett的方法),我不希望该项目得到验证.

我已成功调整客户端的"removeRow"方法,以禁用对逻辑删除的项目进行不显眼的验证,以便尽管存在包含空白字段的项目,表单仍会发布.

在我的控制器方法中[HttpPost] Edit,ModelState.IsValid启动为false(正如预期 - 因为逻辑删除的项目包含空白字段.)所以我从我的ViewModel中删除该项目....但ModelState.IsValid仍然是假的.

总之,我(我想)我想在控制器方法中修改我的ViewModel以删除有问题的项目,然后调用某种"revalidate",并ModelState.IsValid显示为true.

有任何想法吗?

cou*_*ben 125

删除违规项目后,清除ModelState并再次进行验证,如下所示:

ModelState.Clear();
TryValidateModel(crew);  // assumes the model being passed is named "crew"
Run Code Online (Sandbox Code Playgroud)

注意:使用TryValidateModel方法时要小心,因为此方法不验证模型的嵌套对象(如@Merenzo所述).

  • 在我的MVC4项目中,我错误地认为TryValidateModel()没有做任何事情......但是它只是忽略了嵌套对象(根据http://stackoverflow.com/questions/4465432/).在我的MVC4项目中,TryValidateModel()正在恢复那些(a)在顶级对象中的键,以及(b)只有在它们有验证错误的情况下.所以在我看来这个答案是正确的.MVC4是否有重大变化是另一个故事:) (6认同)
  • 谢谢@councellorben - ModelState.Clear确实删除了那些错误(以及整个ModelState.Keys集合),但TryModelValidate似乎没有重新填充ModelState.它似乎什么都没做?例如,如果我不删除有问题的项目,则调用.Clear,然后调用TryValidateModel,我留下一个空白的ModelState,而不是匹配"pre-Clear()"版本. (3认同)
  • 你可以使用TryValidateModel重载方法TryValidateModel(model.NestedModel,"NestedModel") (3认同)
  • 那么,如何将 MVC 所做的深度验证复制到模型中呢?我对所有事情都使用 FluentValidation...但是如果我直接应用验证器,它不会更新模型状态。 (2认同)