A validação de DataTypeAttribute está funcionando no MVC2?

Tanto quanto eu sei o System.ComponentModel.DataAnnotations.DataTypeAttribute não funciona na validação do modelo no MVC v1. Por exemplo,

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

Nos códigos acima, a propriedade Email não será validada no MVC v1. Está funcionando no MVC v2?

[DataType("EmailAddress")] não influencia a validação por padrão. Este é o método IsValid deste atributo (do refletor):

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

Este é um exemplo de DataTypeAttribute personalizado para validar emails (retirados deste site 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)); } } 

Como o LukLed apontou , o DataTypeAttribute não faz nenhuma validação por padrão. Mas influencia modelos sobre como os dados são apresentados.

Por exemplo, se você chamar o método Html.DisplayFor() em um modelo que tenha o atributo DataType(DataType.EmailAddress) , ele formatará seu valor com {0} (pelo menos no MVC RC2).

Como alternativa, você pode usar diretamente o atributo RegularExpression em seu campo, em vez de criar seu próprio atributo que, no final, irá procurar uma correspondência de expressão regular.

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

A partir do .NET 4.5, há EmailAddressAttribute , que possui uma implementação correta do método IsValid . Portanto, se você está almejando o .NET 4.5, então, para validação, considere usar o EmailAddressAttribute vez de um personalizado. Por exemplo,

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

E se você está curioso sobre a implementação do EmailAddressAttribute , então aqui está a fonte descompilada (usando o decompiler JetBrains dotPeek ) da class:

 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; } } } 

Confira a postagem no blog de Scott Guthrie sobre a validação do MVC 2. É excelente. http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx