2010-03-05 10 views
12

Vorrei creare un attributo di convalida personalizzato per MVC2 per un indirizzo di posta elettronica che non eredita da RegularExpressionAttribute ma che può essere utilizzato nella convalida del client. Qualcuno può indicarmi la giusta direzione?Come creare un attributo di convalida personalizzato per MVC

ho cercato qualcosa di semplice come questo:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] 
public class EmailAddressAttribute : RegularExpressionAttribute 
{ 
    public EmailAddressAttribute() 
     : base(Validation.EmailAddressRegex) { } 
} 

ma non sembra funzionare per il cliente. Tuttavia, se uso RegularExpression (Validation.EmailAddressRegex)] sembra funzionare bene.

+0

Non eredita da 'RegularExpressionAttribute' nel tuo esempio? –

+0

Ho provato in entrambi i modi ma non riesco a farlo funzionare. – devlife

+0

È necessario registrare un adattatore per il nuovo attributo per abilitare la convalida del lato client. Vedere il mio esempio qui sotto. – JCallico

risposta

36

È necessario registrare un adattatore per il nuovo attributo per abilitare la convalida del lato client.

Poiché RegularExpressionAttribute ha già un adattatore, che è RegularExpressionAttributeAdapter, tutto ciò che dovete fare è riutilizzarlo.

Utilizzare un costruttore statico per mantenere tutto il codice necessario all'interno della stessa classe.

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] 
public class EmailAddressAttribute : RegularExpressionAttribute 
{ 
    private const string pattern = @"^\w+([-+.]*[\w-]+)*@(\w+([-.]?\w+)){1,}\.\w{2,4}$"; 

    static EmailAddressAttribute() 
    { 
     // necessary to enable client side validation 
     DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAddressAttribute), typeof(RegularExpressionAttributeAdapter)); 
    } 

    public EmailAddressAttribute() : base(pattern) 
    { 
    } 
} 

Per ulteriori informazioni, consultare questo post che spiega il processo completo. http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

+0

Questa espressione regolare invalida l'indirizzo email valido "[email protected]" – Sean

-1

Hai provato a utilizzare Annotazioni dati?

Questo è il mio progetto Annotazioni utilizzando System.ComponentModel.DataAnnotations;

public class IsEmailAddressAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
    //do some checking on 'value' here 
    return true; 
    } 
} 

Questo è in progetto My modelle

namespace Models 
{ 
    public class ContactFormViewModel : ValidationAttributes 
    { 
     [Required(ErrorMessage = "Please provide a short message")] 
     public string Message { get; set; } 
    } 
} 

Questo è il mio controller

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult ContactUs(ContactFormViewModel formViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
    RedirectToAction("ContactSuccess"); 
    } 

    return View(formViewModel); 
} 

Avrai bisogno di google DataAnnotations come è necessario per afferrare il progetto e compilarlo. Lo farei ma ho bisogno di uscire da qui per un lungo w/end.

Spero che questo aiuti.

EDIT

Found this as a quick google.

+1

Ma funziona sul lato client? Per quanto ho capito, è quello che sta chiedendo. –

0

Guardate l'universale Dependent proprietà Validator in this articolo

Problemi correlati