DataAnnotations"NotRequired"属性

Die*_*ego 12 c# asp.net-mvc validationattribute data-annotations asp.net-mvc-3

我有一种复杂的模型.

我有我的UserViewModel,有几个属性,其中两个是HomePhoneWorkPhone.两种类型PhoneViewModel.在PhoneViewModel我有CountryCode,AreaCodeNumber所有字符串.我想使CountryCode可选的,但AreaCodeNumber强制性的.

这非常有效.我的问题是,这UserViewModel WorkPhone是强制性的,而HomePhone不是.

无论如何我可以通过在Require属性中PhoneViewModel设置任何属性来减少HomeWork属性吗?

我试过这个:

[ValidateInput(false)]
Run Code Online (Sandbox Code Playgroud)

但它只适用于类和方法.

码:

public class UserViewModel
{
    [Required]
    public string Name { get; set; }

    public PhoneViewModel HomePhone { get; set; }

    [Required]    
    public PhoneViewModel WorkPhone { get; set; }
}

public class PhoneViewModel
{
    public string CountryCode { get; set; }

    public string AreaCode { get; set; }

    [Required]
    public string Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

VJA*_*JAI 5

[更新于2012年5月24日,以使想法更清晰]

我不确定这是正确的方法,但我认为你可以扩展这个概念,并可以创建一个更通用/可重用的方法.

在ASP.NET MVC中,验证发生在绑定阶段.当您将表单发布到服务器时,DefaultModelBinder是从请求信息创建模型实例并将验证错误添加到服务器的表单ModelStateDictionary.

在您的情况下,只要绑定发生,HomePhone验证将启动,我认为我们无法通过创建自定义验证属性或类似的方式做很多事情.

我所想的只是HomePhone当表格中没有可用的值(areacode,countrycode和number或为空)时,根本不为属性创建模型实例,当我们控制绑定时,我们控制验证,为此,我们有创建自定义模型绑定器.

自定义模型绑定器中,我们检查属性是否HomePhone以及表单是否包含其属性的任何值,如果不是,我们不绑定属性,并且不会发生验证HomePhone.简单地说,值的值HomePhone将为null UserViewModel.

  public class CustomModelBinder : DefaultModelBinder
  {
      protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
      {
        if (propertyDescriptor.Name == "HomePhone")
        {
          var form = controllerContext.HttpContext.Request.Form;

          var countryCode = form["HomePhone.CountryCode"];
          var areaCode = form["HomePhone.AreaCode"];
          var number = form["HomePhone.Number"];

          if (string.IsNullOrEmpty(countryCode) && string.IsNullOrEmpty(areaCode) && string.IsNullOrEmpty(number))
            return;
        }

        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
      }
  }
Run Code Online (Sandbox Code Playgroud)

最后,您必须在global.asax.cs中注册自定义模型绑定器.

  ModelBinders.Binders.Add(typeof(UserViewModel), new CustomModelBinder());
Run Code Online (Sandbox Code Playgroud)

所以你现在有一个以UserViewModel为参数的动作,

 [HttpPost]
 public Action Post(UserViewModel userViewModel)
 {

 }
Run Code Online (Sandbox Code Playgroud)

我们的自定义模型粘合剂发挥作用,形式不张贴的值相对AREACODE,COUNTRYCODE和数量HomePhone,不会有任何验证错误和userViewModel.HomePhone为空.如果表单至少发布了这些属性的任何一个值,则验证将按HomePhone预期进行.