La validation DataTypeAtsortingbute fonctionne-t-elle dans MVC2?

Pour autant que je sache, System.ComponentModel.DataAnnotations.DataTypeAtsortingbute ne fonctionne pas dans la validation de modèle dans MVC v1. Par exemple,

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

Dans les codes ci-dessus, la propriété Email ne sera pas validée dans MVC v1. Est-ce que ça marche dans MVC v2?

    [DataType("EmailAddress")] n’influence pas la validation par défaut. Ceci est la méthode IsValid de cet atsortingbut (à partir de réflecteur):

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

    Voici un exemple de DataTypeAtsortingbute personnalisé permettant de valider des e-mails (extraits de ce site http://davidhayden.com/blog/dave/archive/2009/08/12/CustomDataTypeAtsortingbuteValidationCustomDisplay.aspx ):

     [AtsortingbuteUsage(AtsortingbuteTargets.Field | AtsortingbuteTargets.Property, AllowMultiple = false)] public class EmailAddressAtsortingbute : DataTypeAtsortingbute { private readonly Regex regex = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.Comstackd); public EmailAddressAtsortingbute() : base(DataType.EmailAddress) { } public override bool IsValid(object value) { ssortingng str = Convert.ToSsortingng(value, CultureInfo.CurrentCulture); if (ssortingng.IsNullOrEmpty(str)) return true; Match match = regex.Match(str); return ((match.Success && (match.Index == 0)) && (match.Length == str.Length)); } } 

    Comme LukLed l’a souligné , DataTypeAtsortingbute ne fait aucune validation par défaut. Mais cela influence les modèles concernant la présentation des données.

    Par exemple, si vous appelez la méthode Html.DisplayFor() sur un modèle doté de l’atsortingbut DataType(DataType.EmailAddress) , il {0} sa valeur avec {0} (au moins dans MVC RC2).

    Alternativement, vous pouvez directement utiliser l’atsortingbut RegularExpression sur votre champ au lieu de créer votre propre atsortingbut qui va à la fin vérifier la correspondance d’une expression rationnelle.

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

    À partir de .NET 4.5, il existe EmailAddressAtsortingbute , qui a une implémentation correcte de la méthode IsValid . Donc, si vous ciblez .NET 4.5, alors pour la validation, envisagez d’utiliser EmailAddressAtsortingbute au lieu d’un personnalisé. Par exemple,

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

    Et si vous souhaitez en savoir plus sur l’implémentation de EmailAddressAtsortingbute , voici la source décompilée (à l’aide du décompilateur JetBrains dotPeek ) de la classe:

     using System; using System.ComponentModel.DataAnnotations.Resources; using System.Text.RegularExpressions; namespace System.ComponentModel.DataAnnotations { [AtsortingbuteUsage(AtsortingbuteTargets.Property | AtsortingbuteTargets.Field | AtsortingbuteTargets.Parameter, AllowMultiple = false)] public sealed class EmailAddressAtsortingbute : DataTypeAtsortingbute { 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.Comstackd); static EmailAddressAtsortingbute() { } public EmailAddressAtsortingbute() : base(DataType.EmailAddress) { this.ErrorMessage = DataAnnotationsResources.EmailAddressAtsortingbute_Invalid; } public override bool IsValid(object value) { if (value == null) return true; ssortingng input = value as ssortingng; if (input != null) return EmailAddressAtsortingbute._regex.Match(input).Length > 0; else return false; } } } 

    Consultez le blog de Scott Guthrie sur la validation de MVC 2. C’est excellent. http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx