Ich habe eine einfache Ansicht mit zwei Datumsfeldern mit ValidationMessageFor-Steuerelementen, die für die unauffällige JavaScript-Validierung hinzugefügt wurden.
Mein Problem ist, dass mir immer wieder gesagt wird, dass mein Datum ungültig ist, obwohl es das richtige Format hat (TT/MM/JJJJ).
Ich habe hinzugefügt <globalization culture="en-GB" uiCulture="en-GB"/> zu meiner web.config, und auch enthalten [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] für jede DateTime-Eigenschaft, akzeptiert jedoch immer noch keine Datumsangaben im UK-Format.
Gibt es irgendetwas offensichtliches, das ich hier vermisse?
Also, gelöst mit diesem Beitrag -> stackoverflow.com/questions/511439/… aber WARUM muss ich eine benutzerdefinierte Validierungsmethode erstellen? Sicherlich, wenn ich das Format im Modell angebe und meine Kultur angebe, sollte es dieses Datumsformat verwenden?
– mp3duck
21. August 2012 um 10:40 Uhr
Läuft Ihr Server nicht mit der von Ihnen benötigten Kultur?
– Simon Weißkopf
21. August 2012 um 10:44 Uhr
@SimonWhitehead Es scheint so, aber dies geschah auch, als es lokal auf meinem Entwicklungscomputer ausgeführt wurde
– mp3duck
21. August 2012 um 10:45 Uhr
Ich hatte ähnliche Probleme: stackoverflow.com/questions/9821407/mvc3-en-gb-dates-in-get Weil Microsoft glaubt, dass niemand außerhalb der USA existiert, deshalb 🙂
– Liam
21. August 2012 um 12:38 Uhr
Obwohl der Kommentar “außerhalb der USA existiert niemand” wahr ist, ist er meiner Meinung nach etwas irreführend, da nicht MS, sondern die Mehrheit der US-Entwickler glaubt, dass außerhalb der USA niemand existiert. und Gleichzeitig glaubt die Mehrheit der britischen Entwickler, dass niemand außerhalb Großbritanniens existiert, und so weiter …
– g.pickardou
11. Mai 15 um 15:36 Uhr
Eigentlich müssen Sie nur die unaufdringliche JavaScript-Validierungsmethode für das Datum überladen
jQuery(function ($) {
$.validator.addMethod('date',
function (value, element) {
if (this.optional(element)) {
return true;
}
var ok = true;
try {
$.datepicker.parseDate('dd/mm/yy', value);
}
catch (err) {
ok = false;
}
return ok;
});
});
Es gibt eine internationale Datumsvalidierungsmethode, die stattdessen in der verwendet werden kann zusätzliche-methoden.js Bücherei.
– Eberesche
18. Juni 13 um 9:05 Uhr
In meinem Fall habe ich den parseDate()-Aufruf ersetzt, weil ich Datum und Uhrzeit verwenden wollte (und es scheint, dass die Datumsauswahl dies nicht unterstützt), also habe ich Folgendes verwendet: ` var re = /d{4} -[01]D-[0-3]D [0-2]D:[0-5]D/; var ok; try { ok = value.match(re) != null; } `
– lutecki
27. Oktober 15 um 17:30 Uhr
Nur zur Verdeutlichung: Der Regex-Ausdruck von @lutecki validiert yyyy-mm-dd hh:mm
– blauer Punkt
15. Januar 18 um 15:47 Uhr
Bohdans Beispiel hat wunderbar funktioniert! Ich habe deiner Antwort +1 gegeben, Kumpel.
Der Vollständigkeit halber habe ich einen Blog-Beitrag darüber geschrieben, wie man alle Teile integriert (Model, View, benutzerdefiniertes EditorTemplate, jQuery-Includes und Hinzufügen von Bohdans Lösung).
Es ist eine großartige Sache, dass Sie es in einen Blog gestellt und den gesamten Vorgang Schritt für Schritt erklärt haben, danke.
– Ivan Golović
29. April 14 um 14:57 Uhr
Ich weiß, dass es alt ist, aber damit habe ich der Eingabe ein Attribut mit dem aktuellen Datumsformat hinzugefügt (das ich aus dem ASP-MVC-Code mit CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern.ToLower() abgerufen habe).
Dann habe ich das Validierungs-Javascript neu geschrieben, um das im Attribut gefundene Format zu verwenden.
var format = "mm/dd/yyyy";
if (element.attributes["data-format"]) {
format = element.attributes["data-format"].value;
}
Ich habe auch das gleiche Attribut für den jquery ui datepicker gelesen. Es ist vielleicht nicht so nützlich, aber es kann zumindest das Format mit der Kultur konsistent halten. Obwohl es jemandem helfen könnte
Ich bin
Ich habe im Vergleich zu anderen Antworten einen anderen Ansatz gewählt, um dies zu lösen. Verwenden Sie jQuery, um eine neue Datumsfunktion hinzuzufügen, die das Datum dazu zwingt, die aktuelle lokale Kultur zu verwenden, die in der Anwendung festgelegt ist.
$.validator.addMethod('date', function (value, element) {
var d = new Date();
return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
});
Das ist, wenn es bei der jQuery-Validierung fehlschlägt. Ich schreibe diese Antwort dem Beitrag von Elton Stoneman zu, der gelesen werden kann Hier
Hoffe, das wird jemand anderem helfen.
Zvonimir
Versuchen Sie, dies direkt in jquery.validate.js zu ändern. Arbeiten Sie mit $.datpicker
date: function (value, element) {
var s = value;
var ind2 = 3;
var ind3 = 6;
var ind4 = 4;
if (s.substr(6, 1) != "2") {
ind2 = ind2 + 1;
ind3 = ind3 + 1;
ind4 = ind4 + 1;
}
var ndan = s.substr(0, 2);
var nmje = s.substr(ind2, 2);
var ngod = s.substr(ind3, ind4);
var ns = ngod + "," + nmje + "," + ndan;
return this.optional(element) || !/Invalid|NaN/.test(new Date(ns));
Also, gelöst mit diesem Beitrag -> stackoverflow.com/questions/511439/… aber WARUM muss ich eine benutzerdefinierte Validierungsmethode erstellen? Sicherlich, wenn ich das Format im Modell angebe und meine Kultur angebe, sollte es dieses Datumsformat verwenden?
– mp3duck
21. August 2012 um 10:40 Uhr
Läuft Ihr Server nicht mit der von Ihnen benötigten Kultur?
– Simon Weißkopf
21. August 2012 um 10:44 Uhr
@SimonWhitehead Es scheint so, aber dies geschah auch, als es lokal auf meinem Entwicklungscomputer ausgeführt wurde
– mp3duck
21. August 2012 um 10:45 Uhr
Ich hatte ähnliche Probleme: stackoverflow.com/questions/9821407/mvc3-en-gb-dates-in-get Weil Microsoft glaubt, dass niemand außerhalb der USA existiert, deshalb 🙂
– Liam
21. August 2012 um 12:38 Uhr
Obwohl der Kommentar “außerhalb der USA existiert niemand” wahr ist, ist er meiner Meinung nach etwas irreführend, da nicht MS, sondern die Mehrheit der US-Entwickler glaubt, dass außerhalb der USA niemand existiert. und Gleichzeitig glaubt die Mehrheit der britischen Entwickler, dass niemand außerhalb Großbritanniens existiert, und so weiter …
– g.pickardou
11. Mai 15 um 15:36 Uhr