C# ASP.NET Mvc中的可选验证属性?

C# ASP.NET Mvc中的可选验证属性?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在使用ASP.NETMVC4,在构建表单时遇到了一个概念问题,该表单应允许用户将复杂的数据结构插入数据库。 考虑下面的数据模型: 假设我们想要创建一个客户(Businessrule:每个客户都可以有billing-and deliveryaddress,但必须有一个默认地址作为备用地址) 视图可能如下所示: 地址类型呈现为强类型partialView。我在部分地址视图的模型中填充了注释,如Street、ZIP和Country的[Required],以确保根据基础约束插入地址。我呈现“创建

我正在使用ASP.NETMVC4,在构建表单时遇到了一个概念问题,该表单应允许用户将复杂的数据结构插入数据库。 考虑下面的数据模型:

假设我们想要创建一个客户(Businessrule:每个客户都可以有billing-and deliveryaddress,但必须有一个默认地址作为备用地址)

视图可能如下所示:

地址类型呈现为强类型partialView。我在部分地址视图的模型中填充了注释,如Street、ZIP和Country的[Required],以确保根据基础约束插入地址。我呈现“创建客户”-如下所示… 控制器:

[HttpGet]
public ActionResult CreateCustomer()
{
  var model = new CustomerModel();
  var addresses = new AddressModel[]{
    new AddressModel { AddressTypeId = 1 },//Default, required
    new AddressModel { AddressTypeId = 2 },//Billing, optional!
    new AddressModel { AddressTypeId = 3 }//Delivery, optional!
  };
  model.Addresses = addresses.ToList();
  return View(model);
}
CreateCustomer(视图):

将表单发回服务器时,ModelState.IsValid–显然–返回false,例如,由于地址模型中的([必需],…)注释,仅填充默认地址和账单地址。我想要实现的是要求(验证)默认地址,但忽略可选地址类型的验证(但仅当它们为空时!) 看起来我被一个概念问题困住了。有什么问题吗?:D


提前感谢

您需要两个单独的地址视图模型,一个带有
[必需的]
属性,一个没有,或者一个带有附加属性(比如说)
bool是必需的
并使用条件验证属性,如
[必需的]
@Stephen Muecke感谢您的回复。这绝对是一种可行的方式。我已经在stackoverflow上找到了一篇文章,指出了RequiredIf之类的注释。但由于我必须安装额外的库才能使用它们,我希望它尽可能简单(使用此方法,我必须复制每个注释的逻辑,这些注释看起来像一个codesource…DRY),我想知道在实际调用ModelState之前是否没有任何内置的方法来抑制/禁用某些注释。IsValid…您可以使用流畅的验证来实现此链接:在所有情况下,为了能够忽略某些验证,您需要在客户端或服务器端编写一些代码,可能的解决方案,1-如Steph所述提到的使用注释RequiredIf,2-或在服务器端使用IValidatableObject,3-或在客户端使用JQuery以防止发送可选的空地址类似于
RequiredIf
的自定义属性可以解决这两种情况,而不需要不同的viewmodel类型。如果存在任何字段,则始终需要其他字段,以及如果地址类型==1您需要两个单独的地址视图模型,一个带有
[必需]
属性,另一个不带属性,或者一个带有附加属性(例如)
bool,则输入必填项,并使用条件验证属性,如
[RequiredIf]
@Stephen Muecke感谢您的回复。这绝对是一种可行的方式。我已经在stackoverflow上找到了一篇文章,指出了RequiredIf之类的注释。但由于我必须安装额外的库才能使用它们,我希望它尽可能简单(使用此方法,我必须复制每个注释的逻辑,这些注释看起来像一个codesource…DRY),我想知道在实际调用ModelState之前是否没有任何内置的方法来抑制/禁用某些注释。IsValid…您可以使用流畅的验证来实现此链接:在所有情况下,为了能够忽略某些验证,您需要在客户端或服务器端编写一些代码,可能的解决方案,1-如Steph所述提到的使用注释RequiredIf,2-或在服务器端使用IValidatableObject,3-或在客户端使用JQuery以防止发送可选的空地址类似于
RequiredIf
的自定义属性可以解决这两种情况,而不需要不同的viewmodel类型。如果存在任何字段,则始终需要其他字段,以及如果地址类型==1,则输入必填项
    ….Name, Number,…
  for (int i = 0; i < Model.Addresses.Count; i++)
  {
    ViewBag.CurrentAddressKindName = Model.Addresses[i].AddressKindName;    
    <fieldset>
      <legend>@ViewBag.CurrentAddressKindName</legend>
      @{Html.RenderPartial("~/Views/Address/_FormFields.cshtml", Model.Addresses[i]);}
    </fieldset>
  }
…
[HttpPost]
public ActionResult CreateCustomer(CustomerModel model)
{
  if (!ModelState.IsValid)
  {
    return BadRequest();
  }
  return Ok();
}