2010-09-02 17 views
19

Per mantenere la convalida del modello pulita, vorrei implementare i miei attributi di convalida, come PhoneNumberAttribute e EmailAttribute. Alcuni di questi possono essere implementati come classi semplici che ereditano da RegularExpressionAttribute.ASP.NET MVC annotazioni dati lato client convalida con RegularExpressionAttribute ereditato

Tuttavia, ho notato che questa operazione interrompe la validazione lato client di questi attributi. Presumo che ci sia un tipo di binding di tipo che fallisce da qualche parte.

Qualche idea su cosa posso fare per far funzionare la validazione lato client?

Codice esempio:

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

Ma è un RegularExpressionAttribute ed ha un'espressione regolare, che funziona bene se è esplicitamente definito nel modello. – zidar

+0

Esattamente quello che stavo per chiedere – TWith2Sugars

risposta

26

Avrai bisogno di registrare un adattatore per la validazione lato client per il tuo attributo personalizzato. In questo caso è possibile utilizzare l'oggetto RegularExpressionAttributeAdapter esistente in System.Web.Mvc, poiché dovrebbe funzionare esattamente come l'attributo regex standard. Quindi registrarlo quando avviare l'applicazione utilizzando:

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

In caso di scrivere un attributo che richiede la convalida lato client personalizzato, è possibile implementare il proprio adattatore ereditando da DataAnnotationsModelValidator (vedi anche Phil Haack's blog).

+1

Esattamente quello che stavo cercando, grazie. – zidar

+0

Come registrare l'adattatore dal luogo in cui ho definito l'attributo. Questa implementazione richiede attributi conoscitivi. Non posso passare DLL a un altro sviluppatore e chiedere di usare gli attributi Dovrei anche chiedergli di aggiungere del codice al suo file Asax. C'è un modo meno accoppiato? – Cherven

9

estendendo la risposta giusta

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

Per qualche motivo, anche se veniva chiamato il costruttore statico, questo non stava generando il markup di convalida lato client. Così ho aggiunto la registrazione a 'Application_Start()', in 'Global.asax'. –

Problemi correlati