Validiert ein Datum in einem bestimmten format in ASP.NET MVC-3
Habe ich eine Eigenschaft vom Typ DateTime MyDate
in meinem ViewModel. Ich möchte sicherstellen, dass die Benutzer nur die Daten eingibt Teil in einem text-Feld in einem bestimmten format (dd.mm.yyyy) und versucht die folgenden Attribute:
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)]
[RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$",
ErrorMessage="Failed...")]
public DateTime MyDate { get; set; }
Den controller-action-Signatur für eine HttpPost sieht wie folgt aus:
[HttpPost]
public ActionResult Edit(int id, MyViewModel viewModel)
{
//MyViewModel contains the MyDate property ...
//...
if (ModelState.IsValid)
{
//...
}
//...
}
In der Razor-Ansicht-ich habe versucht, die folgenden zwei Möglichkeiten:
@Html.TextBoxFor(model => model.MyDate)
@Html.EditorFor(model => model.MyDate)
Funktioniert es nicht so wie ich will. Das Ergebnis ist:
- Die clientseitige Validierung funktioniert wie erwartet mit Html-Helfer
- Server-seitige Validierung schlägt immer fehl, für die beide Helfer, auch mit gültigen Datumsangaben wie "17.06.2011" welche durch den regulären Ausdruck. Die
MyDate
Eigenschaft ist korrekt gefüllt, die mit dem angegebenen Datum inviewModel
zur übergabe an die Aktion. Es scheint also, dass Modell-Bindung tätig war. - Die
DisplayFormat
Attribut wird nur beachtet, durchEditorFor
aber nicht durchTextBoxFor
.TextBoxFor
zeigt "dd.mm.yyyy hh:mm:ss"
Fragen:
- Kann ich mich bewerben, eine
RegularExpressionAttribute
auf eine Eigenschaft, die nicht einestring
? Wenn es erlaubt ist, wie ist die reg ex-ausgewertet für einen nicht-string-Eigenschaft, wieDateTime
auf der server-Seite? Ist so etwas wieMyDate.ToString()
im Vergleich mit den reg-ex? (Es würde erklären, dass die Validierung fehlschlägt, weil ToString liefert eine string darunter den Teil der Zeit, die nicht vergehen der reguläre Ausdruck.) - Ist die
DisplayFormat
Attribut in der Regel nur gewahrt durchEditorFor
und nie vonTextBoxFor
? - Wie kann ich ein Datum überprüfung richtig?
InformationsquelleAutor Slauma | 2011-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht verwenden reguläre Ausdrücke zum validieren von Daten, Sie werden einfach ignoriert.
Unterschiede in den Kulturen könnte die Wurzel Ihres Problems. Client-seitige Validierung verwendet die browser-Kultur ein, um zu überprüfen Sie das Datum. So zum Beispiel, wenn es konfiguriert ist, um
en-US
erwarteten format wäreMM/dd/yyyy
. Wenn Ihr server so konfiguriert ist, verwendenfr-FR
erwarteten format wäredd/MM/yyyy
.Könnten Sie die
<Globalisierung>
- element in web.config festlegen der server-Seite Kultur. Sie können es in einer Weise, dass es verwendet die gleiche Kultur wie der client:Hanselman hat eine netter blog-post über Globalisierung und Lokalisierung in ASP.NET MVC.
die Tatsache, dass Sie versucht, diese auf der gleichen Maschine bedeutet nicht, dass es nicht auch Unterschiede in der Kultur, die Einstellungen von dem browser und dem server. Soweit der Zeit-Teil betrifft, würde ich einfach sagen, der user das format, die er braucht, um das Datum, und auf dem server würde ich einfach ignorieren, die Zeit Teil, wenn meine Anwendung nicht brauchen. Vielleicht sogar ein jquery date picker zu vereinfachen dem Benutzer die Eingabe von Datum in einem korrekten format.
Sie haben Recht, ich versuche es zu kompliziert. Jetzt als ein wenig zusätzliche Hilfe für den Benutzer-input habe ich eine
DateOnly
- Attribut (siehe meine Antwort hier). Die Datumsauswahl ist eine bessere Hilfe für die user! Ich werde versuchen, dass als einer der nächsten Schritte.InformationsquelleAutor Darin Dimitrov
Habe ich jetzt weggeschmissen
RegularExpression
. Es scheint nicht geeignet, auf eine Eigenschaft vom TypDateTime
. Dann erstellte ich eine neue validation-Attribut für nullable DateTime und DateTime:Verwendung:
Es nicht eine client-seitige Validierung. Auf der server-Seite die Validierung stützt sich auf das Modell binden (um sicherzustellen, dass der eingegebene string konvertierbar ist, um eine
DateTime
). Wenn der Benutzer in einen Teil der Zeit anderen als Mitternacht dieDateOnly
Attribut in tritt und Sie bekommt eine Warnung, dass nur ein Datum eingegeben werden soll.InformationsquelleAutor Slauma