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

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

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

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

我的问题:当我从列表中逻辑删除一个项目(按照Jarrett的方法),我不希望这个项目被validation。

我已成功调整客户端上的“removeRow”方法以禁用对逻辑删除的项目的不显眼的validation,以便尽pipe存在包含空白字段的项目,表单将张贴。

在我的控制器方法[HttpPost] EditModelState.IsValid作为假(由于包含空白字段的逻辑删除项目,因为预期的开始)。所以,我从我的ViewModel ….删除该项目,但ModelState.IsValid是仍然是假的。

总之,我(想我)想要修改我的ViewModel在控制器方法内删除违规项目,然后调用某种“重新validation”,并具有ModelState.IsValid显示为true。

有任何想法吗?

一旦你删除了违规项目,清除模型状态并再次validation,如下所示:

 ModelState.Clear(); TryValidateModel(crew); // assumes the model being passed is named "crew" 

注意 :使用TryValidateModel方法时要小心,因为此方法不validation模型的嵌套对象(正如@Merenzo所提到的)。

在游戏后期,但仍然:我也正在寻找一种方法来validation模型后,做了一些调整(更确切地说 – 对其嵌套集合的项目) – TryValidateModel没有为我工作,因为它不' t处理嵌套的对象。

最后,我用自定义模型绑定来解决:

 public class MyItemModelBinder : DefaultModelBinder { protected override void OnModelUpdated( ControllerContext controllerContext, ModelBindingContext bindingContext) { if (bindingContext.ModelType == typeof(MyItemModel)) { MyItemModel item = (MyItemModel)bindingContext.Model; //do required tweaks on model here //(I needed to load some additional data from DB) } //validation code will be called here, in OnModelUpdated implementation base.OnModelUpdated(controllerContext, bindingContext); } } 

在模型类上:

 [ModelBinder(typeof(MyItemModelBinder))] public class MyItemModel : IValidatableObject { //... }