2017-04-20 3 views
1

Ich verwende MVC5 und versuche ein Formular zu validieren.EmailAddress DataAnnotation-Markierung als gültig für View, aber ModelState.IsValid = false?

Wenn ich eine ungültige E-Mail-Adresse auf dem Feld einfügen, zeigt es die Fehlermeldung

enter image description here

Wenn ich ein @ ein einfügen (das ist eine gültige E-Mail-Adresse ist), die Validierung Pass-Front-End , aber am Back-End zeigt mein ModelState einen Fehler im E-Mail-Feld an, dass dies ungültig ist.

Wenn ich [email protected] einfüge, werden beide Validierungsseiten übergeben!

Hinweis: Ein großer Teil der anderen SO-Antworten bezogen sich auf "E-Mail-Validierung funktioniert nicht auf MVC", die Lösung bestand darin, das EmailAddress-Attribut zu verwenden, das ich bereits verwende.

Ansicht

@using (Ajax.BeginForm("EnviarMensagemContato", "home", new AjaxOptions { HttpMethod = "POST", OnBegin = "showLoading", OnComplete = "showJsonModalMessage" }, new { @id = "contact-form" })) 
{ 
    @Html.AntiForgeryToken() 
    <div class="col-md-6 lateral-division"> 
     <div class="form-group"> 
      @Html.TextBoxFor(m => m.ContatoViewModel.Nome, new { @class = "form-control required", placeholder = "nome" }) 
      @Html.ValidationMessageFor(m => m.ContatoViewModel.Nome) 
     </div> 
     <div class="form-group"> 
      @Html.TextBoxFor(m => m.ContatoViewModel.EmailAddress, new { @class = "form-control required", placeholder = "email" }) 
      @Html.ValidationMessageFor(m => m.ContatoViewModel.EmailAddress) 
     </div> 
     <div class="form-group"> 
      @Html.TextAreaFor(m => m.ContatoViewModel.Mensagem, 4, 4, new { @class = "form-control required", placeholder = "mensagem" }) 
      @Html.ValidationMessageFor(m => m.ContatoViewModel.Mensagem) 
     </div> 
    </div> 
    <div class="btn-group pull-right btn-send-message"> 
    <input type="submit" value="enviar" id="enviar-mensagem" class="btn btn-default" /> 
    </div> 
} 

Modell

public class ContatoViewModel 
{ 
    [Required(ErrorMessage="campo obrigatório"), 
    Display(Name = "nome")] 
    public String Nome { get; set; } 

    [Required(ErrorMessage = "campo obrigatório"), 
    Display(Name = "nome"), MaxLength(254,ErrorMessage="email inválido"), 
    EmailAddress(ErrorMessage="email inválido")] 
    public String EmailAddress { get; set; } 

    [Required(ErrorMessage = "campo obrigatório"), 
    Display(Name = "nome"), MaxLength(500, ErrorMessage = "maximo de 500 caracteres")] 
    public String Mensagem { get; set; } 
} 

-Controller

public JsonResult EnviarMensagemContato(ModelContainer model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      //zalgo 
     } 
    } 
} 
+0

Ihr Ansichtsmodell scheint nicht das Attribut EmailAddress zu haben. – qamar

+0

@ Qamar es hat, aber asp.net aus irgendeinem Grund verkettet die Datenannotationen in einer einzigen Zeile, d. H .: '[erforderlich (..), maxlength (..)]' anstelle von separaten Zeilen. Es ist auf dem Code. Grüße " –

+0

' a @ a' ist keine gültige E-Mail-Adresse. Und als Randnotiz können Sie die Regex sehen, die vom Attribut [hier] verwendet wird (https://github.com/Microsoft/referencesource/blob/ master/System.ComponentModel.DataAnnotations/DataAnnotations/EmailAddressAttribute.cs) –

Antwort

1

Ich nehme an, Sie sind mit der Standard-jQuery Validation Bibliothek in einem ASP.NET MVC-Projekt. Wenn dies der Fall ist, liegt das Problem in der Tatsache, dass der reguläre Ausdruck, der zum Validieren einer E-Mail verwendet wird, in der Bibliothek jQuery Validation und der EmailAddressAttribute anders ist, wobei das Attribut strenger ist. Mein Vorschlag wäre, die jQuery Validation E-Mail-Methode überschrieben wird, wie folgt:

$.validator.methods.email = function (value, element) { 
    return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/.test(value); 
} 

Der reguläre Ausdruck wird direkt aus dem Code EmailAddressAttribute Quelle entnommen here. Wenn Sie E-Mails ohne TLD zulassen möchten (wie Benutzer @ localhost), könnten Sie Ihr eigenes Attribut wie besprochen in this answer schreiben und den regulären Ausdruck aus der jQuery Validation-Bibliothek ablegen. Auf diese Weise hätten Sie das gleiche Validierungsergebnis auf Client- und Serverseite.

0

ich tun denke nicht, dass a @ a eine gültige E-Mail-Adresse ist, oder wenn es so ist, denke ich nicht, dass das Attribut dies berücksichtigt.

Nachdem ich dies getestet habe, bekomme ich einen Client Validierungsfehler, wenn ich ein @ a gebe. Ich tue nicht, wenn ich [email protected] eingib

Wenn Sie diese Art von E-Mail benötigen, um gültig zu sein, können Sie wahrscheinlich Ihren eigenen Regex-Ausdruck verwenden.

0

Wenn Sie feinkörnige Kontrolle benötigen und Ihren Code transparent vor sich haben, empfehle ich Ihnen, sich nicht auf HTML-Helfer zu verlassen, um Ihre Kontrollen zu zeichnen und die Validierung auf der Client- und Serverseite durchzuführen.

Ich würde die folgenden regulären exp als MVC-Modell-Attribut verwenden.

[Required] 
[RegularExpression(BusinessRules.Email,ErrorMessage = Messages.EmailNotValid)] 
public string LoginEmail { get; set; } 

Wo BusinessRules.Email ist

public const string Email = "^[\\w!#$%&'*+\\-/=?\\^_`{|}~]+(\\.[\\w!#$%&'*+\\-/=?\\^_`{|}~]+)*@((([\\-\\w]+\\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\\.){3}[0-9]{1,3}))$"; 

Auf der Clientseite Validierung, können Sie nur sicherstellen, dass E-Mail nicht leer ist, wenn Sie wollen. Am Ende ist die clientseitige Validierung nicht so wichtig wie die serverseitige Validierung, da sie leicht gefälscht werden kann.

0

Es ist eine gute Übung, Ihre Datenanmerkungen wie den folgenden Code einzeln darzustellen. Dies kann auch bei Ihrem Fehler helfen.

[Required(ErrorMessage="campo obrigatório")] 
    [Display(Name = "nome")] 
    public String Nome { get; set; } 
0

Es gibt zwei separate Kontrollpunkte. Wenn Sie den richtigen Vergleich einmal verwenden, müssen Sie den Wert für eine spätere Verwendung nicht erneut prüfen. Dann wird das Problem mit regulärem Ausdruck gelöst.

1
[Required(ErrorMessage = "The Email address is required")] 
    [RegularExpression(RegularExpression.RegexEmail, ErrorMessage = "Invalid Email address")] 
    public string Email { get; set; } 

In RegularExpression.cs-Datei enthält

/// <summary> 
    /// Regular expression for email 
    /// </summary> 
    public const string RegexEmail = @"[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}"; 
Verwandte Themen