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