6

Ich sehe, es gibt einige ähnliche Fragen dazu, aber keine lösen mein Problem.MVC3 Validierung mit ComponentModel.DataAnnotations für UK Datumsformat (auch mit jquery ui datepicker)

Ich arbeite an einer MVC3 App mit Entity Framework 4.3. Ich habe ein britisches Datumsfeld, das ich dem Benutzer erlauben möchte, mit dem Jquery UI Datepicker zu bearbeiten (was ich dank this blog arbeiten konnte).

Glücklicherweise enthält dieser Blog Anweisungen zur Erstellung des Datumsempfängers im UK-Format, aber die EF-Validierung sagt mir immer noch, dass ich ein gültiges Datumsformat eingeben muss. Leider hindert es mich nicht daran, das Datum an die DB zu senden, es ist nur die unaufdringliche Bestätigung, die eintritt und die Nachricht anzeigt.

Im Moment habe ich folgende Daten Anmerkung haben:

[DataType(DataType.Date)] 
public System.DateTime Module_Date { get; set; } 

, aber ich habe auch versucht, und fügte hinzu:

[DisplayFormat(DataFormatString="{0:dd/MM/yyyy}")] 

, die überhaupt keine Wirkung hatte. Ich hoffe, dass jemand eine Lösung hat, weil ich nicht die unaufdringliche Validierung deaktivieren möchte, um diese Fehlermeldung zu stoppen.

Dank

EDIT

folgende @Iridio Antwort, ich sah in ein Modell Bindung und fügte hinzu, und zwar von den wenigen Stellen wie diese, die ich es gelesen schien das Richtige zu sein, zu tun , aber was ich herausgefunden habe, hat keine Wirkung. hier ist das, was ich versucht habe:

public class DateTimeBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture); 

     return date; 
    } 
} 

mit diesem in der Application_Start() Methode der Global.asax.cs Datei:

ModelBinders.Binders.Add(typeof(DateTime), new DateTimeBinder()); 
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeBinder()); 
+0

Ich glaube, Sie beziehen sich eher auf die System.ComponentModel.DataAnnotations als auf die EntityFramework-Datenanmerkungen? Wenn Sie dem Blog gefolgt sind, geben Sie dann das Datenformat '{dateFormat:" dd/mm/yy "}' in Ihrem clientseitigen Skript an? Wenn ja, welche Version des jquery-ui-Skripts verwenden Sie? – Dangerous

+0

oooh Sie sind ziemlich korrekt, ich verwende die ComponentModel. Ich habe mich daran gewöhnt, die EF beim letzten Projekt zu verwenden. werde Dich auf dem Laufenden halten. Ich war mit jQuery UI 1.8.7, aber ich habe unten ohne Erfolg, wie pro Ihre Antwort auf die neuesten aktualisierten – Ben

+0

oh und ja, ich habe 'angegeben {Datumsformat:„dd/mm/yyyy“}' – Ben

Antwort

4

Richtig, das Problem war mit den jQuery validieren Skripte auf die Verwendung der US-Datefomat. Ich werde mich selbst davon abhalten, richtig darüber zu reden, dass die Mehrheit der Welt TT/MM/JJJJ nutzt.

Wie auch immer, irgendwann fand ich die Antwort auf meine Leiden in einem Kommentar zu einer Antwort auf eine ähnliche question, deren Autor freundlicherweise schrieb blog post darüber, wie er das Problem gelöst hat.

Grundsätzlich habe ich die jquery globalize script verwendet und setzen Sie einfach die Kultur auf en-GB. Ich soll in seinem Blog erwähnen, dass er nicht da, wo nicht erwähnt das Bit zu setzen, wo Sie die Kultur angeben, so dass ich nur in Script-Tags in der Seite unter den Verweisen auf die Globalisierung Skripte schob in:

<script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/globalize.culture.en-GB.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    Globalize.culture("en-GB"); 
    $.validator.methods.date = function (value, element) { 
     return this.optional(element) || Globalize.parseDate(value); 
    }; 
</script> 
+0

Es sollte wirklich nicht notwendig sein, zu all diesen Schwierigkeiten zu gehen, nur um UK Datum validieren zu lassen !! Aber danke für die Info, die ich auf diesem einen steckte. Hoffe, jQuery fügt eine elegantere Möglichkeit hinzu, dies bald zu tun. Das Skript globalize.js (ironisch mit einer z :) geschrieben) -Datei ist ziemlich groß. –

+0

@PaulJohnson Ich stimme zu, ich sollte das nicht tun müssen, und infact ist es nicht eine sehr gute Lösung für viele Fälle, weil es immer UK Format Daten zwingt. – Ben

+0

Ich habe zwei Tage nach einer Lösung für dieses Problem gesucht, wobei der Finger aus den angegebenen Gründen auf JQuery verweist. Dieser Fix hat für mich perfekt funktioniert - obwohl der einfachste Weg zur Implementierung darin bestand, nuget zu verwenden, um das jquery-globeize-Paket hinzuzufügen - und wenn Sie das tun, werden die Script-Speicherorte /Scripts/globalize/globalize.js und/Scripts/globeize/culture/globalize.culture.en-GB.js –

1

Sie haben Sie besitzen Modelbinder für den Datetime-Typ zu schreiben.

Dies ist ein Ordner, den ich für ein ähnliches Problem geschrieben habe, aber mit Dezimal-Typ (vielleicht werden Sie es brauchen). Sie sollten die Idee erfassen und es zu Ihrem Bedarf

public class DecimalModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    try 
    { 
     actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
    } 
} 

Dann in global.asax Sie Ihre Mappe registrieren anpassen und Sie

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    //Here you tell how to hendle the specific type 
    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
} 

UPDATE

Nach der Klärung getan this answer sollte helfen

+0

wow quick response! Vielen Dank! Ich werde versuchen, dass outnow – Ben

+0

versuchte einen ähnlichen Ansatz, aber kann es nicht funktionieren, ich habe meine Frage mit meinem Versuch aktualisiert – Ben

+0

Aktualisiert die Antwort zu globalisieren in Ihrem Client-Seite Validierung – Iridio

1

Ich glaube, es gibt einen Fehler in der Skriptversion des jquery ui date Picker, der mit dem mvc3-Framework ausgeliefert wird (jquery-ui-1.8.11.js).

Wenn Sie das Datum in dem uk-Format (wie in der Tat die Blog-Staaten) angeben:

$(document).ready(function() { 
    $('.date').datepicker({dateFormat: "dd/mm/yy"}); 
}); 

dann jquery-ui-1.8.11.js scheint mit der Validierung des Zeitpunkt um ein Problem zu haben und hält fragen für ein gültiges britisches Datum (aber die Validierung erscheint zufällig).Wenn Sie das Datumsformat in "MM/TT/JJ" ändern, wird dieses Problem wegfallen, aber das ist nicht gut für britische Daten.

Das Problem wird in einer späteren Version dieser Bibliothek so laden Sie die neueste Version (ich glaube, 1.8.18 zum Zeitpunkt des Schreibens) oder verweisen auf die CDN gelöst:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js" type="text/javascript"></script> 
+0

es sieht aus wie ich eine etwas ältere Version verwende (1.8.7) so in das neue getauscht, und es machte keinen Unterschied. Danke, aber – Ben

0

ich dieses Problem hätte Gerade jetzt, brauchte ich Stunden, um den Grund herauszufinden. Ich sage nicht, dass dies dein Problem ist, aber nachdem ich Stunden damit verbracht habe, Globalisierungen auf alles zu setzen, dachte ich, ich würde das Thema hier für alle Leute posten, die mit mir kämpfen.

Wie auch immer, das Problem in meinem Projekt war eigentlich nicht das, was ich dachte, es war. Ich hatte das Grundstück mit [DataAnnotationsExtentions.Date] eingerichtet, die es stellt sich heraus, mucks die Client-seitige Validierung in Chrom, wenn es um die Lokalisierung kommt (das heißt, wenn Sie einen Tag nach dem 12. in England wollen), obwohl es in anderen Browsern zu funktionieren scheint. Sobald ich das entfernte es funktionierte

1

Eigentlich ich habe eine bessere Lösung finden sie hier .... von #fretje

Override jquery date

ich habe ihren/seinen Code leicht aber so modifiziert festgestellt, dass es noch Datumsformate wie 30. Mai 2012 unter nehmen.

$(function() { 
    $.validator.addMethod(
     "date", 
     function (value, element) { 

      //Added to validate dates like 31 May 2012 
      if (value.split('/').length === 1) 
       return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); 

      var bits = value.match(/([0-9]+)/gi), str; 
      if (!bits) 
       return this.optional(element) || false; 
      str = bits[1] + '/' + bits[0] + '/' + bits[2]; 
      return this.optional(element) || !/Invalid|NaN/.test(new Date(str)); 
     }, 
     "Please enter a date in the format dd/mm/yyyy" 
    ); 

    $global.init(); 
}); 
0

Das Problem ist, aus irgendeinem Grund, dass, wenn Sie eine Klasse setzen namens „date“ in Ihrer Textbox, Chrome nur verrückt wie hier bei this blog discribed. Ich hatte das gleiche Problem und ich änderte gerade den Klassennamen zu customDate und es wurde gelöst.

+0

Bitte posten Sie keine Link-Only-Antworten –