在不同视图中共享视图模型时,模型状态失败



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

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

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

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

提前谢谢你。

您可以在

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

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

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

public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
}

如何使用 IValidatableObject?

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

您有两种选择(据我所知!),首先您可以在将所需属性发布到操作时取消绑定该必需属性:

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

但是,您可以通过在 get 操作中将 ViewModel 映射到视图并将其发送到视图来为应用程序解决此问题。 试试这篇很棒的文章

相关内容

  • 没有找到相关文章

最新更新