在不同的视图中共享ViewModel时,ModelState失败

时间:2014-02-10 21:09:39

标签: c# asp.net-mvc viewmodel modelstate

我有一个将ViewModel发布到Action方法的简单表单。在保存信息之前,使用标准if(ModelState.IsValid)检查ModelState。然后创建并保存新对象。很好,它有效。

最近,另一个开发人员进入并使用我原来的ViewModel创建了一个新视图。他还为ViewModel添加了一个新的[Required]属性,以使其逻辑工作。

通过这样做,他的逻辑打破了我最初的逻辑。因为我的初始视图没有使用他的新必需属性,所以ModelState.IsValid现在检查失败,我的代码没有运行。

这里最好的方法是什么?虽然我不想,但是我应该摆脱ModelState.IsValid检查我的Post操作,还是我可以以某种方式将他的新属性标记为在原始视图中使用时或在我的操作方法中发布时不需要?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以从IValidatableObject派生模型,然后使用

执行自己的自定义验证
public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
}

How do I use IValidatableObject?

Edtied补充说:如果是我,那么让他从你的模型中创建一个继承的模型似乎更有意义,即使它只有1个属性。这将使本机MVC验证能够以最小的努力正常工作。

答案 1 :(得分:1)

您可以在动作方法中使用属性[Bind(Exclude="")],如下所示。然后,当您提交表单时,模型绑定器将忽略该属性,即使它是必需的。

[HttpPost]
public ActionResult Index([Bind(Exclude = "AdditionalProperty")]YourModel model)
{
  //
}

答案 2 :(得分:1)

你有两个选择(据我所知!),首先你可以在将所需属性发布到动作时解除绑定:

    [HttpPost]
    public ActionResult Create([Bind(Exclude = "RequiredProperty")]MyViewModel myViewModel)
    {
       if(ModelState.IsValid)
       {
         //
       }

    }

但是您可以通过在get操作中将ViewModel映射到View来解决此问题,并将其发送到视图。试试这篇great文章