在控制器方法中重新validation修改后的ViewModel?
编辑 – 我们正在使用MVC4开发预览….
我正在实施一个FishingTrip
类的编辑页面。 FishingTrip
包含简单Crew
对象(即FishingTripID,CrewID,CrewPosition)的子集合。
我正在使用Jarrett Meyer的方法从Crew
集合中添加,编辑和删除。 我使用不显眼的validation来指定Crew
的属性都是Required
。
我的问题:当我从列表中逻辑删除一个项目(按照Jarrett的方法),我不希望这个项目被validation。
我已成功调整客户端上的“removeRow”方法以禁用对逻辑删除的项目的不显眼的validation,以便尽pipe存在包含空白字段的项目,表单将张贴。
在我的控制器方法[HttpPost] Edit
, ModelState.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 { //... }