Problem mit Dezimalstellen, Kommas und clientseitiger Validierung

Ich versuche eine clientseitige Validierung für anullable<decimal> dessen Dezimaltrennzeichen kann ein Komma sein (z. B .: 123,45).

Aus meiner Sicht:

...

<div class="editor-label">
    @Html.LabelFor(model => model.Turnover)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Turnover)
    @Html.ValidationMessageFor(model => model.Turnover)
</div>

...

@section Scripts {

   @Styles.Render("~/Content/themes/base/css")
   @Scripts.Render("~/bundles/jquery")
   @Scripts.Render("~/bundles/jqueryui")
   @Scripts.Render("~/bundles/jqueryval")
   @Scripts.Render("~/bundles/jQueryFixes")
   ...scripts for this view...
}

Meine jQueryFixes überschreibenjquery.validate.js Datei für dierange() undnumber():

$.validator.methods.range = function (value, element, param) {
    var globalizedValue = value.replace(",", ".");
    return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]);
}

$.validator.methods.number = function (value, element) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
}

... wie in vielen Beiträgen / Fragen zu diesem Thema vorgeschlagen (z. B .:Hier oderHier).

Seltsamerweise:

Wenn ich versuche, einen Wert wie 123,45 zu übermitteln, und obwohl ich das Skript mit Firebug debuggt und festgestellt habe, dass meine Überschreibungsfunktionen aufgerufen werden und true zurückgeben, kann ich das Formular nicht übermitteln. Stattdessen wird mein EditorFor für den Dezimalwert aus irgendeinem Grund fokussiert, und ich kann anscheinend nicht herausfinden, warum.

(Ich glaube, dass meine serverseitige Validierung - unter Verwendung eines benutzerdefinierten Binders usw. - einwandfrei funktioniertist hier nicht das Problem: Ich hätte gerne eine Hilfe, wie ich das Formular absenden kann oder warum das Eingabefeld fokussiert wird, obwohl es gültig aussieht.)

EDIT 1:

Zusätzliche Information. In meiner BundlesConfig.cs:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-{version}.js"));
...
bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
                    "~/Scripts/jquery-ui-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.unobtrusive*",
                    "~/Scripts/jquery.validate*"));
bundles.Add(new ScriptBundle("~/bundles/jQueryFixes").Include(
                    "~/Scripts/jQueryFixes.js")); 
...

EDIT 2:

Nach dem @LeftyX-Vorschlag habe ich versucht, das Globalize-Skript zu verwenden (nachdem ich meine jQueryFixes.js entfernt habe):

<script type="text/javascript">
    ...

    $( document ).ready(function() {
        Globalize.culture("en-US", "pt-PT");
    });

    $.validator.methods.number = function (value, element) {
        return this.optional(element) || jQuery.isNumeric(Globalize.parseFloat(value));
    }

    //Fix the range to use globalized methods
    jQuery.extend(jQuery.validator.methods, {
        range: function (value, element, param) {
            var val = Globalize.parseFloat(value);
            return this.optional(element) || (val >= param[0] && val <= param[1]);
        }
    });

   ...
</script>

... aber ich stehe immer noch vor dem gleichen Problem: demvalidator.methods.number gibt true zurück, aber das Formular wird nicht gesendet und stattdessen wird das Eingabefeld fokussiert.

Wenn ich das Eingabeelement während der Übermittlung überprüfe, kann ich feststellen, dass es sich schnell ändertclass="valid" zuclass='input-validation-error' und dann zurück zuvalid. Sehr eigenartig.

FAZIT:

@LeftyX gab eine sehr gute und vollständige Lösung für alle, die die gleichen Probleme finden.

Ich hatte bereits einen benutzerdefinierten Modellordner für die nullbaren Dezimalstellen, aber das Globalisierungsskript und die Aufnahme der Kultur in das Model / ViewModel sind sehr praktisch.

Ein weiterer Grund für mein Problem könnte die Tatsache sein, dass ich (aus Versehen) einige Skripte zweimal eingefügt habe.

UPDATE (Jul / 2015):

globalize.js ist jetzt ein bisschen anders. Ref. zudiese Antwort unddie Dokumentation für die aktualisierten Schritte.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage