2010-03-05 20 views
12

Me gustaría crear un atributo de validación personalizado para MVC2 para una dirección de correo electrónico que no herede de RegularExpressionAttribute pero que pueda usarse en la validación del cliente. ¿Alguien puede señalarme en la dirección correcta?Cómo crear un atributo de validación personalizado para MVC

que hemos probado algo tan simple como esto:

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

pero no parece trabajar para el cliente. Sin embargo, si uso RegularExpression (Validation.EmailAddressRegex)] parece funcionar bien.

+0

Usted hereda de 'RegularExpressionAttribute' en su ejemplo? –

+0

Lo he intentado de ambas formas pero parece que no funciona. – devlife

+0

Debe registrar un adaptador para el nuevo atributo para habilitar la validación del lado del cliente. Vea mi ejemplo a continuación. – JCallico

Respuesta

36

Debe registrar un adaptador para el nuevo atributo para habilitar la validación del lado del cliente.

Dado que RegularExpressionAttribute ya tiene un adaptador, que es RegularExpressionAttributeAdapter, todo lo que tiene que hacer es reutilizarlo.

Utilice un constructor estático para mantener todo el código necesario dentro de la misma clase.

[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) 
    { 
    } 
} 

Para obtener más información, consulte esta publicación que explica el proceso completo. http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

+0

Esta expresión regular invalidaría la dirección de correo electrónico válida "[email protected]" – Sean

-1

¿Ha intentado utilizar anotaciones de datos?

Este es mi proyecto Anotaciones usando System.ComponentModel.DataAnnotations;

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

Esto está en mis modelos proyectan

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

Ésta es mi controlador de

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

    return View(formViewModel); 
} 

Tendrá que google DataAnnotations como sea necesario para agarrar el proyecto y compilarlo. Lo haría pero tengo que salir de aquí por un largo tiempo.

Espero que esto ayude.

EDITAR

Found this as a quick google.

+1

¿Pero eso funciona en el lado del cliente? Por lo que yo entiendo, eso es lo que está preguntando. –

0

mirada a lo universal dependiente Propiedad Validador en this artículo

Cuestiones relacionadas