2010-09-02 7 views
19

Pour conserver la validation de mon modèle propre, je souhaite implémenter mes propres attributs de validation, tels que PhoneNumberAttribute et EmailAttribute. Certains d'entre eux peuvent être favorablement mis en œuvre en tant que classes simples qui héritent de RegularExpressionAttribute.Annotations de données ASP.NET MVC validation côté client avec RegularExpressionAttribute héritée

Cependant, j'ai remarqué que cela casse la validation côté client de ces attributs. Je suppose qu'il existe une sorte de liaison de type qui échoue quelque part.

Des idées sur ce que je peux faire pour que la validation côté client fonctionne?

Exemple de code:

public sealed class MailAddressAttribute : RegularExpressionAttribute 
{ 
    public MailAddressAttribute() 
     : base(@"^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}$") 
    { 
    } 
} 
+0

Mais il est un RegularExpressionAttribute et il a une expression régulière, ce qui fonctionne très bien si elle est explicitement défini dans le modèle. – zidar

+0

Exactement ce que j'étais sur le point de demander – TWith2Sugars

Répondre

26

Vous devez vous enregistrer un adaptateur de validation côté client pour votre attribut personnalisé. Dans ce cas, vous pouvez utiliser le RegularExpressionAttributeAdapter existant dans System.Web.Mvc, car il doit fonctionner exactement de la même manière que l'attribut regex standard. Alors inscrivez-vous quand votre application commencer à utiliser:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(MailAddressAttribute), 
    typeof(RegularExpressionAttributeAdapter)); 

Si vous écrire un attribut qui nécessite la validation personnalisée côté client, vous pouvez implémenter votre propre adaptateur en héritant de DataAnnotationsModelValidator (voir aussi Phil Haack's blog).

+1

Exactement ce que je cherchais, merci. – zidar

+0

Comment enregistrer l'adaptateur à l'endroit où j'ai défini l'attribut. Cette implémentation nécessite des attributs de connaissance. Je ne peux pas passer DLL à un autre développeur et demander à utiliser des attributs, je devrais également lui demander d'ajouter du code à son fichier asax. Y a-t-il plus moins de manière couplée? – Cherven

9

extension de la bonne réponse

public class EmailAttribute : RegularExpressionAttribute 
{ 
    static EmailAttribute() 
    { 
     DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter)); 
    } 

    public EmailAttribute() 
     : base(@"^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$") //^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$ 
    { 

    } 
} 
+0

Pour une raison quelconque, même si le constructeur statique était appelé, cela ne générait pas le balisage de validation côté client. J'ai donc ajouté l'enregistrement à 'Application_Start()', dans 'Global.asax'. –