DataTypeAttributevalidation是否在MVC2中有效?

据我所知,System.ComponentModel.DataAnnotations.DataTypeAttribute不适用于MVC v1中的模型validation。 例如,

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

在上面的代码中,不会在MVC v1中validationEmail属性。 它在MVC v2中运行吗?

[DataType("EmailAddress")]默认不影响validation。 这是此属性的IsValid方法(来自reflection器):

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

这是用于validation电子邮件的自定义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)); } } 

与LukLed指出的一样,DataTypeAttribute默认情况下不进行任何validation。 但它确实会影响有关数据呈现方式的模板。

例如,如果在具有DataType(DataType.EmailAddress)属性的模型上调用Html.DisplayFor()方法,则它将使用{0}格式化其值。 (至少在MVC RC2中)。

或者,您可以直接在字段上使用RegularExpression属性,而不是创建自己的属性,最终将检查正则表达式匹配。

 [RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = PaErrorMessages.InvalidEmailAddress)] public string Email { get; set; } 

从.NET 4.5开始,有EmailAddressAttribute ,它具有正确的IsValid方法实现。 因此,如果您的目标是.NET 4.5,那么要进行validation,请考虑使用EmailAddressAttribute而不是自定义的。 例如,

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

如果您对EmailAddressAttribute的实现感到好奇,那么这里是反编译(使用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("^((([az]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([az]|\\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)))@((([az]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([az]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([az]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([az]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([az]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([az]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([az]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([az]|[\\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; } } } 

查看Scott Guthrie关于MVC 2validation的博客文章。 这很棒。 http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx