58

编辑- 我们正在使用 MVC4 Dev Preview....

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

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

我的问题:当我从列表中逻辑删除一个项目时(根据 Jarrett 的方法),我不希望验证该项目。

我已经成功地调整了客户端上的“removeRow”方法,以禁用对逻辑删除项目的不显眼验证,这样即使有一个项目包含空白字段,表单也会发布。

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

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

有任何想法吗?

4

2 回答 2

140

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

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

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

于 2011-10-20T14:08:56.580 回答
3

游戏迟到了,但仍然:我也在寻找一种在对模型进行一些调整验证模型的方法(更准确地说 - 对其嵌套集合的项目)——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
{
    //...
}
于 2015-03-16T18:18:44.863 回答