Convalida dell'indirizzo e-mail utilizzando gli attributi del tipo di dati ASP.NET MVC


163

Ho dei problemi con la convalida di un'e-mail.

Nel mio modello:

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

Secondo me:

<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)

Ora mi sta mostrando correttamente "Il campo non può essere vuoto" quando lasci il campo vuoto. Ma quando si inserisce un indirizzo e-mail non valido come: "fwenrjfw", il modulo non dice "L'e-mail non è valida".

Come posso ottenere il modulo per convalidare l'input come indirizzo e-mail? Sto cercando aiuto per questo.

Risposte:


328

Se si utilizza .NET Framework 4.5, la soluzione consiste nell'utilizzare ciò EmailAddressAttributeche risiede all'interno System.ComponentModel.DataAnnotations.

Il codice dovrebbe essere simile al seguente:

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

Grazie @Shittu Olugbenga! Ma non riesco a capire perché questo non funziona:[DataType(DataType.EmailAddress, ErrorMessage = "Error message.")]
Wellington Zanelli,

15
@Wellington Zanelli - Il DataType (DataType.EmailAddress) non può essere utilizzato per convalidare l'input dell'utente. Viene utilizzato solo per fornire un suggerimento UI per il rendering dei valori utilizzando i modelli display / editor.
Liam,

3
@Jni DataType.EmailAddressnon riguarda la validazione. Riguarda la presentazione dei dati ...
Sebastian Xawery Wiśniowiecki,

3
Ho lo stesso problema e per me la convalida dell'e-mail funziona bene, tranne per le e-mail come "nome @ xxx". Qualcun altro l'ha visto?
Kremena Lalova,

3
@KremenaLalova name@xxxè un indirizzo email completamente valido, quindi non c'è niente di sbagliato in questo metodo. Considera l'esempio username@localhostper esempio.
John Bergman,

39

Prova il Html.EditorFormetodo helper anziché Html.TextBoxFor.


1
Questa è la risposta corretta in quanto utilizzerà il tipo di dati e l'errore già aggiunti nel modello.
Ricardo Sanchez,

4
questo metodo non controlla il dominio tld, quindi qualcuno potrebbe inserire il mio nome @ qualunque cosa e tralasciare .com e verrà validato correttamente
JasonH,

8
myname @ qualunque sia un indirizzo e-mail valido
michaelmsm89,

Ha funzionato perfettamente per mvc 4. Grazie.
Jose Gomez,

Cosa scrivere all'interno di html.Editor per convalidare la posta elettronica?
Neeraj Kumar,

28

È necessario utilizzare l'attributo RegularExpression, in questo modo:

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

E non eliminare [Obbligatorio] perché [RegularExpression] non influisce sui campi vuoti.


8
Il vecchio skool è carino ma poiché Microsoft ha implementato un attributo risolve bug e sviste che possono verificarsi in determinate situazioni, paesi, fusi orari o pianeti. Quindi è meglio usare una base di codice completamente rilasciata rispetto a regex personalizzato. Il tuo regex prende in considerazione i nuovi domini di primo livello, ad esempio?
Piotr Kula,

2
Quel regex sembra fallire per qualsiasi indirizzo e-mail con caratteri stranieri o molti caratteri non standard.
EricP,

2
Convalidare gli indirizzi e-mail con regex è di solito un'idea terribile ... ma se è necessario, qui c'è un riferimento eccellente ... regular-expressions.info/email.html
Molomby

9
Questa regex e questo sito Web sono sbagliati. Ci sono molti nuovi TLD più di 6 caratteri. Non seguire questo.
jsgoupil,

14

se non stai ancora utilizzando .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";
    }
}

Quindi puoi farlo:

    public class ContactEmailAddressDto
    {
        public int ContactId { get; set; }
        [Required]
        [Display(Name = "New Email Address")]
        [EmailAnnotation] //**<----- Nifty.**
        public string EmailAddressToAdd { get; set; }
    }

1
Mi piace il costruttore statico.
Brian Sweeney,

1
@BrianSweeney, non posso prendermi il merito: P. Ancora un altro bocconcino che ho ricevuto da qui anni fa.
mcfea,

10

Uso MVC 3. Un esempio di proprietà dell'indirizzo e-mail in una delle mie lezioni è:

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

Rimuovere Requiredse l'ingresso è facoltativo. Non ho bisogno di espressioni regolari, anche se ne ho una che copre tutte le opzioni all'interno di un indirizzo e-mail fino al livello RFC 2822 (è molto lungo).


3
In quale spazio dei nomi è il tuo attributo Email? O è un attributo personalizzato?
Utente

5
MVC 4 usa [EmailAddress]e devi avereusing System.ComponentModel.DataAnnotations;
Piotr Kula il

1
Sembrerebbe che, qualunque cosa io faccia, l'uso di uno Emailo entrambi RegularExpressionrende obbligatorio il campo. La rimozione Requireddell'annotazione non ha alcun effetto. Qualche suggerimento su cosa fare per fare in modo che i campi con RegularExpressionconvalida accettino campi vuoti?
Eric K,

@QuantumDynamix Prova ad aggiungere un test stringa vuoto alla tua espressione regolare come opzione. Non l'ho mai provato, ma chi lo sa?
Peter Smith,

7
[Required(ErrorMessage = "Please enter Social Email id")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress]
    public string Email { get; set; }

4

Utilizzato il codice sopra nel progetto MVC5 e funziona perfettamente con l'errore di convalida. Basta provare questo codice

   [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; }

1
Benvenuto in StackOverflow. Le risposte di solo codice non sono considerate una buona pratica. Si prega di elaborare cosa fa e come risolve il problema.
Quinz,

0

Gli script di solito vengono caricati alla fine della pagina html e MVC consiglia l'uso di bundle, solo dicendo. Quindi la mia scommessa migliore è che i tuoi jquery.validatefile siano stati modificati in qualche modo o non siano aggiornati all'ultima versione, poiché convalidano gli input e-mail.

Quindi potresti aggiornare / aggiornare il tuo pacchetto nuget o scrivere la tua funzione, davvero.

Ecco un esempio che aggiungerebbe in un file aggiuntivo dopo 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"
);

Questa è solo una copia e incolla dell'attuale jquery.validateRegex, ma in questo modo potresti impostare il tuo messaggio di errore personalizzato / aggiungere metodi extra ai campi che potresti voler convalidare nel prossimo futuro.


0

In base a quanto sopra risolverà la convalida lato server di un indirizzo e-mail:

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

Però...

Se si utilizza la convalida lato client JQuery, è necessario sapere che l'e-mail convalida in modo diverso dal lato server (convalida del modello) al lato client (convalida JQuery). In quel test @ example (un indirizzo email di dominio di livello superiore) fallirebbe sul lato server ma verificherebbe bene sul lato client.

Per correggere questa disparità è possibile ignorare la convalida della posta elettronica lato client predefinita come segue:

$.validator.methods.email = function (value, element) {
    return this.optional(element) || /^[a-z0-9._]+@[a-z]+\.[a-z.]+/.test(value);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.