MVC 3 jQuery Validierung/Globalisierung von Zahlen-/Dezimalfeld
Lesezeit: 8 Minuten
designvision.dk
Bei Verwendung von globalization culture=”da-DK” in der Datei Web.config funktioniert die jQuery-Validierung nicht.
In Dänemark verwenden wir die Notation 19,95 anstelle der US-amerikanischen Schreibweise 19,95, wenn wir einen Preis für ein Produkt schreiben, und das hat mir ein Problem bereitet, das ich nicht lösen kann.
Ich habe VS2010, ein neues MVC 3-Projekt, gestartet, einen HomeController, eine Produktklasse und eine einfache Standard-Bearbeitungsansicht hinzugefügt, und der Fehler ist bereits da.
Produktklasse:
public class Product
{
public string name { get; set; }
public string itemNo { get; set; }
public decimal price { get; set; }
}
HomeController:
public class homeController : Controller
{
public ActionResult Index()
{
var product1 = new Product { name = "Testproduct", itemNo = "PRD-151541", price = 19 };
return View(product1);
}
}
SO – beim Ausführen der Website wird das Feld auf 19,00 gesetzt – was die korrekte Kulturdefinition IST – aber beim Speichern schlägt die Validierung fehl.
Bitte helfen…
+1 gute Frage, ich habe das gleiche Problem, nur mit Daten
– Darko Z
19. Mai 11 um 0:22 Uhr
gute Frage und besser, wenn Sie dies an Microsoft Connect senden. Wenn ein Entwickler automatisch Ansichten basierend auf einem Entitätsframework generiert, verhält sich @Html.ValidationMessageFor für Dezimalfelder genau so, wie Sie es hier gezeigt haben.
Ohh, es ist wirklich seltsam – ich war gestern auf dieser Seite und konnte es nicht zum Laufen bringen. Aber es funktioniert jetzt – VIELEN DANK!
– designvision.dk
5. März 11 um 10:39 Uhr
Wenn der Wert “0” ist, gibt parseFloat 0 zurück, was falsch ist. Ich habe das so gelöst $.validator.methods.number = function (value, element) { return parseFloat(value).toString() !== “NaN”; }
– Zote
14. März 11 um 19:18 Uhr
Besserer Code zur Unterstützung optionaler Elemente $.validator.methods.number = function (value, element) { return this.optional(element) || !isNaN(Globalize.parseFloat(value)); } $(function () { Globalize.culture('%%culture%%'); });
– schatel
27. Juni 11 um 11:54 Uhr
Veraltet oder hat bei mir zumindest nicht funktioniert. Siehe die Antwort von Shatl für eine aktuelle Version (funktionierte für mich).
Fügen Sie einfach die 2 Skripte hinzu globalize.js und cultures/globalize.cultures.js zu Ihrem HTML und das obige zu einem Skriptblock.
– lko
23. Februar 12 um 11:18 Uhr
Das ist richtig. Siehe meine Antwort für den vollständigen Code + Range-Hack.
– RickAndMSFT
1. August 12 um 22:46 Uhr
RickAndMSFT
@shatl hat ab heute die richtige Antwort. Beachten Sie, dass Sie für das Bereichsattribut einen Hack benötigen, der unten gezeigt wird. Der vollständige hinzuzufügende Code ist unten dargestellt:
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
<script type="text/javascript" src="https://stackoverflow.com/questions/5199835/~/Scripts/globalize.js"></script>
<script type="text/javascript" src="~/Scripts/globalize.culture.fr-FR.js"></script>
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
return this.optional(element) ||
!isNaN(Globalize.parseFloat(value));
}
$(document).ready(function () {
Globalize.culture('fr-FR');
});
jQuery.extend(jQuery.validator.methods, {
range: function (value, element, param) {
//Use the Globalization plugin to parse the value
var val = $.global.parseFloat(value);
return this.optional(element) || (
val >= param[0] && val <= param[1]);
}
});
</script>
}
Ich bin schließlich den Ratschlägen in Scott Hanselmans Blog zu diesem Thema gefolgt – Sie können darüber hier lesen:
Ich musste einige Änderungen vornehmen, um Globalize anstelle von jQuery Global zu verwenden (jetzt ist jQuery Global tot). Ich habe dies im folgenden Blog-Beitrag aufgeschrieben, falls das hilfreich ist:
Nur für die Zukunft, was bei mir funktioniert hat, war Folgendes:
Denken Sie daran, die richtige jQuery-Version und die richtige Kultur festzulegen, die in diesem Beispiel dänisch ist.
Wenn der Wert keine Punkte enthalten darf, kommentieren Sie den Kommentar aus.
<script src="https://stackoverflow.com/questions/5199835/@Url.Content("~/Scripts/jquery-1.5.1.min.js")"
type="text/javascript"></script>
<script src="https://stackoverflow.com/questions/5199835/@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script src="https://stackoverflow.com/questions/5199835/@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
<script src="https://stackoverflow.com/questions/5199835/@Url.Content("~/Scripts/jquery.globalize/globalize.js")"
type="text/javascript"></script>
<script src="https://stackoverflow.com/questions/5199835/@Url.Content("~/Scripts/jquery.globalize/cultures/globalize.culture.da-DK.js")"
type="text/javascript"></script>
<script type="text/javascript">
$.validator.methods.number = function (value, element) {
// if (value.indexOf(".") >= 0) {
// return false;
// }
return (Globalize.parseFloat(value));
}
$(document).ready(function () {
Globalize.culture('da-DK');
});
jQuery.extend(jQuery.validator.methods, {
range: function (value, element, param) {
//Use the Globalization plugin to parse the value
var val = Globalize.parseFloat(value);
return this.optional(element) || (val >= param[0] && val <= param[1]);
}
});
</script>
Danke für diese Seite, hat mir viel Ärger erspart, ich musste den Globalize-Code jedoch reparieren. Die schwedische Kultur akzeptiert keinen Punkt als Trennzeichen, aber da parseFloat das zugrunde liegende Java-Skript verwendet, werden Punkte als Dezimaltrennzeichen akzeptiert, aber serverseitig werden diese abgelehnt. Um dies zu beheben, überschreibe ich das parseFloat wie folgt
Globalize.orgParaseFloat = Globalize.parseFloat;
Globalize.parseFloat = function(value) {
var culture = this.findClosestCulture();
var seperatorFound = false;
for (var i in culture.numberFormat) {
if (culture.numberFormat[i] == ".") {
seperatorFound = true;
}
}
if (!seperatorFound) {
value = value.replace(".", "NaN");
}
return this.orgParaseFloat(value);
};
Ich habe ein Ticket bei ihrem Github eröffnet, vielleicht wird das behoben
+1 gute Frage, ich habe das gleiche Problem, nur mit Daten
– Darko Z
19. Mai 11 um 0:22 Uhr
gute Frage und besser, wenn Sie dies an Microsoft Connect senden. Wenn ein Entwickler automatisch Ansichten basierend auf einem Entitätsframework generiert, verhält sich @Html.ValidationMessageFor für Dezimalfelder genau so, wie Sie es hier gezeigt haben.
– Junior Mayhé
11. Januar 13 um 17:36 Uhr