Validación de dirección de correo electrónico utilizando atributos de tipo de datos ASP.NET MVC

163

Tengo algunos problemas con la validación de un correo electrónico.

En mi modelo:

[Required(ErrorMessage = "Field can't be empty")]
[DataType(DataType.EmailAddress, ErrorMessage = "E-mail is not valid")]
public string ReceiverMail { get; set; }

En mi vista:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Html.TextBoxFor(m => m.ReceiverMail, new { @placeholder="E-mail"}) <br />
@Html.ValidationMessageFor(m => m.ReceiverMail)

Ahora me muestra correctamente "El campo no puede estar vacío" cuando deja el campo vacío. Pero cuando completa una dirección de correo electrónico no válida como: "fwenrjfw", el formulario no dice "El correo electrónico no es válido".

¿Cómo puedo obtener el formulario para validar la entrada como una dirección de correo electrónico? Estoy buscando ayuda con esto.

Java Afca
fuente

Respuestas:

328

Si está utilizando .NET Framework 4.5, la solución es usar el EmailAddressAttributeque reside dentro System.ComponentModel.DataAnnotations.

Su código debería ser similar a esto:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
Shittu Joseph Olugbenga
fuente
Gracias @Shittu Olugbenga! Pero no puedo entender por qué esto no funciona:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli
15
@Wellington Zanelli: el DataType (DataType.EmailAddress) no se puede usar para validar la entrada del usuario. Solo se utiliza para proporcionar una sugerencia de interfaz de usuario para representar los valores utilizando las plantillas de visualización / editor.
Liam
3
@Jni DataType.EmailAddressno se trata de validación. Se trata de la presentación de datos ...
Sebastian Xawery Wiśniowiecki
3
Tengo el mismo problema y para mí la validación de correo electrónico funciona bien, excepto para correos electrónicos como 'nombre @ xxx'. ¿Alguien más ha visto esto?
Kremena Lalova
3
@KremenaLalova name@xxxes una dirección de correo electrónico completamente válida, por lo que no hay nada de malo en ese método. Considere el ejemplo username@localhostpor ejemplo.
John Bergman
39

Pruebe el Html.EditorFormétodo auxiliar en lugar de Html.TextBoxFor.

hazimdikenli
fuente
1
Esta es la respuesta correcta, ya que utilizará el tipo de datos y el error que ya agregó en su modelo.
Ricardo Sanchez
44
este método no verifica el dominio tld, por lo que alguien podría poner mi nombre @ lo que sea y omitir .com y se validará correctamente
JasonH
8
myname @ sea cual sea una dirección de correo electrónico válida
michaelmsm89
Funcionó perfectamente para mvc 4. Gracias.
Jose Gomez
¿Qué escribir dentro de html.Editor para validar el correo electrónico?
Neeraj Kumar el
28

Necesita usar el atributo RegularExpression, algo como esto:

[RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]

Y no elimine [Obligatorio] porque [Expresión regular] no afecta a los campos vacíos.

Alexander Imra
fuente
8
Old skool es agradable, pero desde que Microsoft implementó un atributo, aborda errores y descuidos que pueden ocurrir en ciertas situaciones, países, zonas horarias o planetas. Por lo tanto, es mejor usar una base de código completamente liberada que una expresión regular personalizada. ¿Su expresión regular toma en consideración los nuevos dominios de nivel superior, por ejemplo?
Piotr Kula
2
Parece que la expresión regular fallará para cualquier dirección de correo electrónico con caracteres extranjeros o muchos caracteres no estándar.
EricP
2
La validación de direcciones de correo electrónico con las expresiones regulares es generalmente una mala idea ... pero si es necesario, hay una excelente referencia aquí .. regular-expressions.info/email.html
Molomby
9
Esta expresión regular y el sitio web están equivocados. Hay muchos TLD nuevos de más de 6 caracteres. No sigas este.
jsgoupil
14

si aún no estás usando .net 4.5:

/// <summary>
/// TODO: AFTER WE UPGRADE TO .NET 4.5 THIS WILL NO LONGER BE NECESSARY.
/// </summary>
public class EmailAnnotation : RegularExpressionAttribute
{
    static EmailAnnotation()
    {
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAnnotation), typeof(RegularExpressionAttributeAdapter));
    }

    /// <summary>
    /// from: http://stackoverflow.com/a/6893571/984463
    /// </summary>
    public EmailAnnotation()
        : base(@"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
            + "@"
            + @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$") { }

    public override string FormatErrorMessage(string name)
    {
        return "E-mail is not valid";
    }
}

Entonces puedes hacer esto:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }
Mcfea
fuente
1
Me gusta el constructor estático.
Brian Sweeney
1
@BrianSweeney, no puedo dar crédito por ello: P. Otro dato que obtuve de aquí hace años.
mcfea
10

Uso MVC 3. Un ejemplo de propiedad de dirección de correo electrónico en una de mis clases es:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[Email(ErrorMessage = "The email address is not valid")]
public string Email { get; set; }

Elimine el Requiredsi la entrada es opcional. No necesito expresiones regulares, aunque tengo una que cubre todas las opciones dentro de una dirección de correo electrónico hasta el nivel RFC 2822 (es muy larga).

Peter Smith
fuente
3
¿En qué espacio de nombre está su atributo de correo electrónico? ¿O es un atributo personalizado?
Usuario
55
MVC 4 utiliza [EmailAddress]y necesita tenerusing System.ComponentModel.DataAnnotations;
Piotr Kula
1
Parecería que no importa lo que haga, el uso de cualquiera Emailo RegularExpressionhace que el campo es necesario. Eliminar la Requiredanotación no tiene ningún efecto. ¿Alguna sugerencia sobre qué hacer para que los campos con RegularExpressionvalidación acepten campos vacíos?
Eric K
@QuantumDynamix Intente agregar una prueba de cadena vacía a su expresión regular como una opción. Nunca lo intenté, pero ¿quién sabe?
Peter Smith
7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }
Kuganrajh Rajendran
fuente
4

Usé el código anterior en el proyecto MVC5 y funciona completamente bien con el error de validación. Solo pruebe este código

   [Required]
   [Display(Name = "Email")]
   [EmailAddress]

   [RegularExpression(@"^([A-Za-z0-9][^'!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ][a-zA-z0- 
    9-._][^!&\\#*$%^?<>()+=:;`~\[\]{}|/,₹€@ ]*\@[a-zA-Z0-9][^!&@\\#*$%^?<> 
        ()+=':;~`.\[\]{}|/,₹€ ]*\.[a-zA-Z]{2,6})$", ErrorMessage = "Please enter a 
   valid Email")]


   public string ReceiverMail { get; set; }
Kalyani Rathore
fuente
1
Bienvenido a StackOverflow. Las respuestas de solo código no se consideran una buena práctica. Explique qué hace esto y cómo resuelve el problema.
quinz
0

Los scripts generalmente se cargan al final de la página html, y MVC recomienda el uso de paquetes, solo diciendo. Entonces, mi mejor apuesta es que sus jquery.validatearchivos se alteraron de alguna manera o no se actualizan a la última versión, ya que validan las entradas de correo electrónico.

Por lo tanto, puede actualizar / actualizar su paquete nuget o escribir su propia función, realmente.

Aquí hay un ejemplo que agregaría en un archivo adicional después de jquery.validate.unobtrusive:

$.validator.addMethod(
    "email",
    function (value, element) {
        return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
    },
    "This e-mail is not valid"
);

Esto es solo una copia y pega del jquery.validateRegex actual , pero de esta manera puede configurar su mensaje de error personalizado / agregar métodos adicionales a los campos que desee validar en el futuro cercano.

Tiramonio
fuente
0

Según lo anterior, esto solucionará la validación del lado del servidor de una dirección de correo electrónico:

[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }

Sin embargo...

Si está utilizando la validación del lado del cliente JQuery, debe saber que el correo electrónico valida de manera diferente el lado del servidor (validación del modelo) al lado del cliente (validación de JQuery). En esa prueba @ ejemplo (una dirección de correo electrónico de dominio de nivel superior) fallaría en el lado del servidor pero se validaría bien en el lado del cliente.

Para solucionar esta disparidad, puede anular la validación de correo electrónico predeterminada del lado del cliente de la siguiente manera:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
Jon Ryan
fuente