Asp.net-MVC ermöglicht jetzt die implizite Bindung von DateTime-Objekten. Ich habe eine Aktion in der Art von
public ActionResult DoSomething(DateTime startDate)
{
...
}
Dadurch wird eine Zeichenfolge aus einem Ajax-Aufruf erfolgreich in eine DateTime konvertiert. Wir verwenden jedoch das Datumsformat TT / MM / JJJJ; MVC konvertiert in MM / TT / JJJJ. Wenn Sie beispielsweise einen Aufruf der Aktion mit der Zeichenfolge '09 / 02/2009 'senden, wird in unseren lokalen Einstellungen eine DateTime von '02 / 09/2009 00:00:00' oder der 2. September angezeigt.
Ich möchte aus Gründen eines Datumsformats keinen eigenen Modellordner rollen. Es scheint jedoch unnötig zu sein, die Aktion zu ändern, um eine Zeichenfolge zu akzeptieren und dann DateTime.Parse zu verwenden, wenn MVC dies für mich tun kann.
Gibt es eine Möglichkeit, das im Standardmodellordner für DateTime verwendete Datumsformat zu ändern? Sollte der Standardmodellbinder Ihre Lokalisierungseinstellungen nicht trotzdem verwenden?
quelle
Antworten:
Ich habe gerade die Antwort darauf mit etwas ausführlicherem googeln gefunden:
Melvyn Harbour hat eine ausführliche Erklärung, warum MVC so mit Datumsangaben arbeitet und wie Sie diese bei Bedarf überschreiben können:
http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx
quelle
MM/dd/yyyy
Format. Andernfalls wird ein Validierungsfehler angezeigtThe field BeginDate must be a date.
. Wie kann ich den Server dazu bringen, dasdd/MM/yyyy
Format zu akzeptieren ?Ich würde Ihre Kulturen global bestimmen. ModelBinder hol das ab!
Oder Sie ändern dies einfach für diese Seite.
Aber global in web.config finde ich das besser
quelle
Ich habe das gleiche Problem mit der Bindung des kurzen Datumsformats an die DateTime-Modelleigenschaften. Nachdem ich mir viele verschiedene Beispiele angesehen habe (nicht nur in Bezug auf DateTime), habe ich Folgendes zusammengestellt:
Um sicherzustellen, dass Routen usw. in der globalen ASAX-Datei registriert werden, habe ich dem Ordner App_Start meines MVC4-Projekts mit dem Namen CustomModelBinderConfig eine neue sytatische Klasse hinzugefügt:
Ich rufe dann einfach die statischen RegisterCustomModelBinders von meinem globalen ASASX Application_Start wie folgt auf:
Ein wichtiger Hinweis hierbei ist, dass, wenn Sie einen DateTime-Wert in ein verstecktes Feld wie folgt schreiben:
Ich habe das getan und der tatsächliche Wert auf der Seite hatte das Format "MM / TT / JJJJ hh: mm: ss tt" anstelle von "TT / MM / JJJJ hh: mm: ss tt", wie ich wollte. Dies führte dazu, dass meine Modellvalidierung entweder fehlschlug oder das falsche Datum zurückgab (offensichtlich wurden die Werte für Tag und Monat vertauscht).
Nach vielen Kopfkratzern und fehlgeschlagenen Versuchen bestand die Lösung darin, die Kulturinformationen für jede Anfrage festzulegen, indem Sie dies in Global.ASAX tun:
Es funktioniert nicht, wenn Sie es in Application_Start oder sogar Session_Start stecken, da es dem aktuellen Thread für die Sitzung zugewiesen wird. Wie Sie wissen, sind Webanwendungen zustandslos, sodass der Thread, der Ihre Anfrage zuvor bearbeitet hat, nicht derselbe Thread ist, der Ihre aktuelle Anfrage bearbeitet. Daher wurden Ihre Kulturinformationen an den großen GC im digitalen Himmel gesendet.
Vielen Dank an: Ivan Zlatev - http://ivanz.com/2010/11/03/custom-model-binding-using-imodelbinder-in-asp-net-mvc-two-gotchas/
garik - https://stackoverflow.com/a/2468447/578208
Dmitry - https://stackoverflow.com/a/11903896/578208
quelle
In MVC 3 wird es etwas anders sein.
Angenommen, wir haben einen Controller und eine Ansicht mit der Get-Methode
Wir sollten ModelBinder hinzufügen
und den Befehl in Application_Start () von Global.asax
quelle
IModelBinder
insbesondere in Bezug auf die Validierung nicht korrekt implementiert wird. Es auch, funktioniert nur , wenn der Name derDateTime
ist Datums- und Uhrzeit .DateTime?
nur funktioniert, wenn Sie einen weiteren AnrufModelBinders.Binders.Add
mit hinzufügentypeof(DateTime?)
.Es ist auch erwähnenswert, dass auch ohne Erstellen eines eigenen Modellbinders mehrere verschiedene Formate analysiert werden können.
In den USA sind beispielsweise alle folgenden Zeichenfolgen gleichwertig und werden automatisch an denselben DateTime-Wert gebunden :
Ich würde dringend empfehlen, JJJJ-MM-TT zu verwenden, da es viel portabler ist. Sie möchten sich wirklich nicht mit der Verarbeitung mehrerer lokalisierter Formate befassen. Wenn jemand am 1. Mai statt am 5. Januar einen Flug bucht, werden Sie große Probleme haben!
NB: Ich bin mir nicht sicher, ob JJJJ-MM-TT in allen Kulturen allgemein analysiert wird. Vielleicht kann jemand, der es weiß, einen Kommentar hinzufügen.
quelle
Versuchen Sie, toISOString () zu verwenden. Es gibt eine Zeichenfolge im ISO8601-Format zurück.
GET-Methode
Javascript
c #
POST-Methode
Javascript
c #
quelle
Ich habe die folgende Konfiguration auf meinem MVC4 eingestellt und es funktioniert wie ein Zauber
quelle
quelle
quelle
Ich setze
CurrentCulture
undCurrentUICulture
meinen benutzerdefinierten Basis-Controllerquelle