Warum die Validierung funktioniert nicht mit Html.TextBoxFor aber ist bei der Verwendung von Html."EditorFor"?
Ich versuche das MVC-Datentyp Attribute, und einfach, erstellt ein einfaches Szenario, wie die folgenden:
Den Ansicht:
@model MVC4.Models.Model
@{
ViewBag.Title = "DataTypeAttribute";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<h2>DataTypeAttribute</h2>
@using (Html.BeginForm("SubmitData", "Home"))
{
<div>
@Html.ValidationSummary()
</div>
@Html.EditorFor(m => m.Email)
<br />
<br />
@Html.EditorFor(m => m.PostalCode)
<br />
<br />
@Html.EditorFor(m => m.TextOnly)
<br />
<br />
<button type="submit">Submit</button>
}
Den Modell:
public class Model
{
[DataType(DataType.EmailAddress)]
[Required]
//[EmailAddress]
public string Email { get; set; }
[DataType(DataType.PostalCode)]
public string PostalCode { get; set; }
public string TextOnly { get; set; }
}
"SubmitData" ist nur ein controller, der Sicht Retouren(..., Modell), wenn ModelState.IsValid false ist.
Obwohl Beiträge wie diese tun, einen guten job bei der Bewältigung der Unterschiede zwischen Html.TextBoxFor und Html."EditorFor" konnte ich nicht finden, eine Antwort auf die Frage, warum die Validierung für die Datentyp EmailAddress wird nicht die Arbeit, wenn Sie TextBoxFor. Ich fand die Leute erwähnen TextBoxFor nicht nehmen Metadaten berücksichtigen, während "EditorFor" tut.
Aber macht das Sinn ? So TextBoxFor nicht bieten Unterstützung für client Validierungen ?!
Frage ich mich, was ist der Grund für den Unterschied zwischen den beiden ?
- Zusammenfassung der Antwort: die neuen input-Typen eingeführt, die mit HTML 5, wie z.B. <input type= "email" /> hinzufügen einer automatischen Validierung. TextBoxFor immer generieren Eingänge vom Typ 'text', und daher keine eingebaute Validierung generiert. Auf der anderen Seite, "EditorFor" übernimmt Modell Felder mit Metadaten (Daten Anmerkungen) berücksichtigt bei der Generierung der html-Code für Sie, so ein Feld mit der Aufschrift "DataType(DataType.EmailAddress)" generiert ein input type='email', und damit die neue built-in HTML 5 Validierung zusammen mit ihm.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TextBoxFor()
funktioniert mit Validierungen.[DataType(DataType.EmailAddress)]
ist nicht ein validation-Attribut. Seine ein Attribut, das bestimmt die Art der Eingabe der Anzeige durch Einstellung dertype
- Attribut in das html gerendert. Zum Beispiel<input type="text" ..>
,<input type="date" ..>
,<input type="email" ..>
um die Browser-Implementierung der HTML-4-datepicker -, E-Mail-Eingang usw.. Es funktioniert nur fürEditorFor()
weilTextBoxFor()
wie der name andeutet, erzeugt und die Eingabe mittype="text"
Wenn Sie möchten, dass die überprüfung für eine E-Mail-Adresse, dann verwenden Sie die
[EmailAddress]
Attribut auf Ihrem Grundstück.Bearbeiten (weitere Kommentare)
Eines der features von HTML5 ist die Möglichkeit der Validierung von Benutzerdaten, ohne sich auf Skripte. Eine solche form der browser-überprüfung ist mit der
type
Attribut. Die Verwendung von[DataType(DataType.EmailAddress)]
auf eine Eigenschaft, die gerendert wird mit@Html.EditorFor()
fügttype="email"
zu deninput
element. Aus der MDN-DokumentationWenn Ihr sehen derzeit eine Validierung Fehlermeldung in Verbindung mit der Eigenschaft, und Sie haben nicht Hinzugefügt, die
[EmailAddress]
Attribut, dann bedeutet es, dassjquery.validate.js
wird nicht geladen, und Sie sehen die Browser-Fehlermeldung in Verbindung mittype="email"
.Wenn
jquery.validate.js
geladen ist (richtig), dienovalidate="novalidate"
- Attribut wird Hinzugefügt, um dieform
- element, das angibt, dass Formular nicht validiert werden (mit dem HTML5-Validierung), die bei der Abgabe. Der entsprechende code ausjquery.validate.js
ist (ca Zeile 35)Dies ist Hinzugefügt, um zu verhindern, dass mögliche Verwechslungen zwischen Fehlermeldungen angezeigt, die von browser-Validierung und jquery unobtrusive validation.
Warum
DataTypeAttribute
Attribut erbt ValidationAttribute, wenn es nicht tatsächlich tun, Validierung von Brad Wilson selbst in diese Antwortjquery.validate.unobtrusive.min.js
die auf seinen eigenen Willen tun, absolut nichts. Sie müssenjquery.js
undjquery.validate.js
undjquery.validate.unobtrusive.js
(in dieser Reihenfolge). Und auch ich schlage vor, Sie verwenden@Html.ValidationMessageFor()
im Zusammenhang mit den einzelnen Steuerelement, und ändern Sie@Html.ValidationSummary()
zu@Html.ValidationSummary(true)
data-val
Attribute, die auf das gerenderte html. Alle[DataType]
Attribut id wird die entsprechendetype
AttributDataType.Text
ist nur die standard-Eingabe -<input type="text" ..>
(identisch mitTextBoxFor()
). Das andere wird, hängt von der browser Ihre Verwendung und, wenn Sie umgesetzt wurden, die vom browser. Zum BeispielDataType.Time
ist nicht umgesetzt in FireFox nochDataType.EmailAddresses
sein, da client-seitige Validierung ist nicht implementiert und seine dann mit der Browser-Implementierung.[EmailAddress]
die Eigenschaft, den Unterschied zu sehenValidationAttribute
. Wenn ich einige Zeit gehe ich durch den source-code und sehen, ob es gibt einige offensichtliche Grund und Sie wissen lassen, - sonst es ist wahrscheinlich eine Frage für die Entwickler 🙂novalidate="novalidate"
Attribut dem deaktiviert HTML5-Validierung (jquery Validierung und HTML5 Validierung nicht gut zusammen spielen)