编辑 - 我们正在使用MVC4 Dev Preview ....
我正在为FishingTrip
课程实施编辑页面。 FishingTrip
包含简单Crew
个对象的子集合(即FishingTripID,CrewID,CrewPosition)。
我正在使用Jarrett Meyer's approach来添加,编辑和删除Crew
集合。
我正在使用不显眼的验证来指定Crew
的属性都是Required
。
我的问题:当我从列表中逻辑删除项目时(根据Jarrett的方法),我不希望该项目得到验证。
我已成功调整客户端的“removeRow”方法,以禁用对逻辑删除的项目进行不显眼的验证,以便尽管存在包含空白字段的项目,表单仍会发布。
在我的控制器方法[HttpPost] Edit
中,ModelState.IsValid
从false开始(正如预期的那样 - 因为逻辑删除的项目包含空白字段。)所以我从ViewModel中删除了该项目...但是ModelState.IsValid
仍然是假的。
总之,我(我想)我想在控制器方法中修改我的ViewModel以删除有问题的项目,然后调用某种“revalidate”,并让ModelState.IsValid
显示为true。
有什么想法吗?
答案 0 :(得分:125)
删除违规项目后,清除ModelState并再次验证,如下所示:
ModelState.Clear();
TryValidateModel(crew); // assumes the model being passed is named "crew"
注意:使用TryValidateModel
方法时要小心,因为此方法不验证模型的嵌套对象(如@Merenzo所述)。
答案 1 :(得分:2)
比赛结束,但仍然:
我还在寻找一种方法来验证模型之后对它进行一些调整(更确切地说 - 对其嵌套集合的项目) - 并且TryValidateModel
对我不起作用,如它不处理嵌套对象。
最后,我决定使用自定义模型绑定器:
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
{
//...
}