代码之家  ›  专栏  ›  技术社区  ›  wenqiang

数据类型属性验证是否在MVC2中工作?

  •  21
  • wenqiang  · 技术社区  · 16 年前

    据我所知,system.componentmodel.dataannotations.datatypeattribute在mvc v1的模型验证中不起作用。例如,

    public class Model
    {
      [DataType("EmailAddress")]
      public string Email {get; set;}
    }
    

    在上面的代码中,电子邮件属性将不会在MVC v1中验证。它在mvc v2中工作吗?

    5 回复  |  直到 10 年前
        1
  •  36
  •   Artur Carvalho    13 年前

    [DataType("EmailAddress")] 默认情况下不影响验证。这是 IsValid 此属性的方法(来自反射镜):

    public override bool IsValid(object value)
    {
        return true;
    }
    

    这是用于验证电子邮件的自定义datatypeattribute的示例(取自此网站 http://davidhayden.com/blog/dave/archive/2009/08/12/CustomDataTypeAttributeValidationCustomDisplay.aspx ):

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple  = false)]
    public class EmailAddressAttribute : DataTypeAttribute
    {
        private readonly Regex regex = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.Compiled);
    
        public EmailAddressAttribute() : base(DataType.EmailAddress)
        {
    
        }
    
        public override bool IsValid(object value)
        {
    
            string str = Convert.ToString(value, CultureInfo.CurrentCulture);
            if (string.IsNullOrEmpty(str))
                return true;
    
            Match match = regex.Match(str);   
            return ((match.Success && (match.Index == 0)) && (match.Length == str.Length));
        }
    }
    
        2
  •  13
  •   Community Mohan Dere    9 年前

    喜欢 LukLed pointed out ,默认情况下,datatypeattribute不执行任何验证。但它确实会影响数据呈现方式的模板。

    例如,如果你打电话给 Html.DisplayFor() 一个模型的方法 DataType(DataType.EmailAddress) 属性,它将使用 <a href="mailto:{0}">{0}</a> (至少在MVC RC2中)。

        3
  •  8
  •   Etienne    13 年前

    或者,您可以直接在字段上使用regularExpression属性,而不是创建自己的属性,该属性最后将检查regex匹配。

    [RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = PaErrorMessages.InvalidEmailAddress)]
    public string Email { get; set; }
    
        4
  •  2
  •   John Mills    10 年前

    从.net 4.5开始 EmailAddressAttribute ,它正确地实现了 IsValid 方法。因此,如果您的目标是.net 4.5,那么为了进行验证,请考虑使用 EmailAddressAttribute 而不是定制的。例如,

    public class Model
    {
        [EmailAddress(ErrorMessage = "INVALID EMAIL")]
        public string Email {get; set;}
    }
    

    如果你对 电子邮件地址属性 ,那么这里是反编译的(使用 JetBrains dotPeek 反编译器)类的源:

    using System;
    using System.ComponentModel.DataAnnotations.Resources;
    using System.Text.RegularExpressions;
    
    namespace System.ComponentModel.DataAnnotations
    {
      [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
      public sealed class EmailAddressAttribute : DataTypeAttribute
      {
        private static Regex _regex = new Regex("^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
    
        static EmailAddressAttribute()
        {
        }
    
        public EmailAddressAttribute()
          : base(DataType.EmailAddress)
        {
          this.ErrorMessage = DataAnnotationsResources.EmailAddressAttribute_Invalid;
        }
    
        public override bool IsValid(object value)
        {
          if (value == null)
            return true;
          string input = value as string;
          if (input != null)
            return EmailAddressAttribute._regex.Match(input).Length > 0;
          else
            return false;
        }
      }
    }
    
        5
  •  1
  •   Rick    16 年前

    查看scott guthrie关于mvc 2验证的博客文章。太棒了。 http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx