2017-02-02 6 views
6

In meiner ASP MVC 5-Webanwendung muss ich ein Datum in einem bestimmten Format anzeigen. Wenn die Seite geladen wird, ist der Text korrekt formatiert.ASP MVC 5 Datumsformat Validierung Problem

enter image description here

Das Feld definiert ist, wie folgt aus:: Aber wenn Sie den Wert bearbeiten oder einfach zu schreiben versuchen, wird der Validierungsfehler angezeigt

 @*Creation*@ 
    <div class="form-group"> 
     @Html.LabelFor(model => model.Creation, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(model => model.Creation, "{0:dd/MM/yyyy}", new { @class = "form-control"}) 
      @Html.ValidationMessageFor(m => m.Creation) 
     </div> 
    </div> 

Die Eigenschaft Viewmodel ist definiert als:

 [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
    [Display(Name = "Creation", ResourceType = typeof(Resources.Resources))] 
    public DateTime Creation { get; set; } 

Der Screenshot wurde mit Firefox-Browser erstellt. Wenn ich dasselbe bei Edge mache, wird die Validierung bestanden, aber das Abwarten dieser Eigenschaft für die post-Methode ist ungültig (ein Standarddatumswert).

Wie kann ich dieses Problem beheben?

+1

Als Matt Spinks hat zur Kenntnis genommen, das ist eine 'jquery.validate.js' Ausgabe (validiert Daten basierend auf MM/TT/JJJJ und Sie müssen den Validator überschreiben (siehe [diese Antwort] (http://stackoverflow.com/questions/30594128/error-in-date-validation-mvc/30609111) # 30609111) für weitere Details –

+1

Der Grund, warum es in Edge (und in Chrome) funktioniert, ist, weil Sie '[DataType (DataType.Date)] haben 'was generiert' type = "date" 'was bedeutet, dass die Browser-Implementierung eines DatePickers angezeigt wird, aber damit das funktioniert, müssen Sie' DataFormatString = "{0: yyyy-MM-dd}" '(ISO-Format) verwenden) –

+1

Siehe auch [diese Antwort] (http://stackoverflow.com/questions/39677035/date-of-birth-validation-keeps-showing/39682410#39682410), die ein Skript enthält, das Sie in Ihrer Ansicht für die Clientseite einschließen können Validierung. –

Antwort

5

Das Problem hier ist, dass hinter den Kulissen die Validierung tatsächlich von jQuery durchgeführt wird. Der Schlüssel ist also, dem jQuery-Validator mitzuteilen, dass Sie das Format TT/MM/JJJJ verwenden werden.

Es gibt mehrere Möglichkeiten, dies zu tun. Der einfachste Weg ist es, nur die Prüffunktion überschreibt (Termine) mit einem simpe zwicken:

jQuery(function ($) { 
    $.validator.addMethod('date', 
    function (value, element) { 
     $.culture = Globalize.culture("en-AU"); 
     var date = Globalize.parseDate(value, "dd/MM/yyyy", "en-AU"); 
     return this.optional(element) || 
     !/Invalid|NaN/.test(new Date(date).toString()); 
    }); 
}); 

Eine Alternative eine Globalisierung Bibliothek für jQuery zu verwenden wäre. Es gibt eine Globalisierungsbibliothek, die Sie verwenden können here.

Wenn Sie die Bibliothek haben, gehören die folgenden Dateien:

globalize.js 
globalize.culture.en-AU.js 

dann die Prüffunktion außer Kraft setzen:

<script type="text/javascript"> 
    $(function() { 
     $.validator.methods.date = function (value, element) { 
      Globalize.culture("en-AU"); // the UK format 
      return this.optional(element) || Globalize.parseDate(value) !== null; 
     } 
    }); 
</script> 
+0

Hi @Matt, ich habe die Bibliothek installiert (via NuGet-Paket), habe KEINE Dateien manuell hinzugefügt und dann die Validierungsfunktion außer Kraft gesetzt. Mein Standort ist pt-BR, also habe ich "en-AU" durch "pt" ersetzt. Jetzt erhält die Validierung nichts. Wenn ich ein falsches Datum wie: 30/12/2016dssfds eintippe, wird es nicht validiert. Außerdem schlägt die Bindung immer noch fehl. Irgendwelche Ideen? –

+0

Sie können überprüfen, ob alle Ihre Dateien korrekt enthalten sind (keine 404). –

+0

Ich habe auch den einfachsten Weg versucht, den du vorgeschlagen hast (simple tweak) und das Ergebnis ist genau das selbe. Es findet keine Validierung statt. Ich habe das globeize-Paket entfernt, um sicherzustellen, dass es den Tweak nicht beeinflusst. Was meinst du mit 404s? –