Come creare attributo di validazione personalizzato per MVC
-
24-09-2019 - |
Domanda
Vorrei creare un attributo di convalida personalizzato per MVC2 per un indirizzo e -mail che non eredita da RegulaRexpressionAttribute ma che può essere utilizzato nella convalida del client. Qualcuno può indicarmi nella giusta direzione?
Ho provato qualcosa di così 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.
Soluzione
È necessario registrare un adattatore per il nuovo attributo per abilitare la convalida sul lato client.
Poiché la regolarexpressionAttribute ha già un adattatore, che è regolarexpressionAttributeApter, tutto ciò che devi 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 sul checkout questo post che spiega il processo completo.http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx
Altri suggerimenti
La pagina MSDN CustomValidationAttribute Class Adesso ha alcuni esempi. Il Phil Haacked Post è obsoleto.
Guarda il validatore della proprietà universale dipendente in questo articolo
Hai provato a utilizzare le annotazioni dei dati?
Questo è il mio progetto di annotazioni utilizzando System.componentModel.DataAnnotations;
public class IsEmailAddressAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
//do some checking on 'value' here
return true;
}
}
Questo è nel mio progetto di modelli
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);
}
Dovrai le dataNnotazioni di Google in quanto è necessario prendere il progetto e compilarlo. Lo farei ma devo uscire da qui per un lungo w/fine.
Spero che sia di aiuto.
MODIFICARE