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

时间:2011-10-20 08:55:40

标签: asp.net-mvc asp.net-mvc-3 unobtrusive-validation asp.net-mvc-4

编辑 - 我们正在使用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。

有什么想法吗?

2 个答案:

答案 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
{
    //...
}