0

我目前正在使用单个操作来处​​理 2 个使用单独 ViewModel 的视图,如下所示:

[HttpPost]
public ActionResult(PrivateCustomer p, CorporateCustomer c)
{
  if(Modelstate.IsValid) { ... }
}

我的视图模型如下所示:

public abstract class Customer
{
  public string Name {get; set;}
  public string UserName {get; set;}
  ...
}
public class PrivateCustomer: Customer
{
  ...
}
public class CorporateCustomer: Customer
{
  [Required]
  public new string Name {get; set;}
}

这意味着我可以为两个(密切相关的)视图模型使用 1 个 url/action。但是,问题是,我接受两个视图模型作为我的发布操作的参数,并且两者都会进行模型验证(即使我只会使用一个)。

鉴于我发布了一个不需要名称的 PrivateCustomer,我仍然会在该属性上收到验证错误。

我想知道是否有一种优雅的方法可以以某种方式防止这种情况发生,最好不要手动从我的 ModelState 中删除错误。

最好的办法是只验证这两个对象中的任何一个。

在此先感谢您的任何建议。

4

2 回答 2

0

这在模型中很难做到,因为在您可以在服务器端修改它之前检查 POST 数据。如果您不想拆分操作,我建议在模型中删除 [Required] 数据注释并在控制器中进行验证,如下所示:

[HttpPost]
public ActionResult(PrivateCustomer p, CorporateCustomer c)
{

     if (c != null)
     {
          if (c.Name == null || c.Name == "")
          {
               ModelState.AddModelError("Name", "Name is required.");
          }
     }

     if(Modelstate.IsValid) { ... }

}
于 2013-05-14T13:34:10.880 回答
0

您可以通过为要传递给操作方法的类型实现自定义 ModelBinders 来做到这一点。在模型绑定器中,您可以覆盖 BindModel。在那里,您可以决定如何构建模型的每个实例并决定是否包含 ModelState 错误。由于这是在您输入操作方法之前完成的,因此您的操作方法仅在您的逻辑需要时才会看到 ModelState 错误。

于 2013-05-14T13:35:05.030 回答