2016-04-27 8 views
0

Ich erhalte eine DateTime von einer impliziten Bindung an einer Aktion in einer .NET MVC-Webanwendung. Das Problem ist, dass ich das Datum im Format "MM/TT/JJJJ" bekomme, während ich es durch eine Abfragezeichenkette mit Ajax im Format "TT/MM/JJJJ" sende.DateTime.Parse funktioniert nicht auf einem benutzerdefinierten MVC-Binder

Ich weiß, dass dies ein bekanntes Problem der .NET MVC-Sammelmappe bei Verwendung des GET-Protokolls und nicht POST ist, also habe ich einen benutzerdefinierten Binder implementiert, um das Datum im richtigen Format zu analysieren. Hier ist der Code:

Aber mit diesem Code funktioniert die Parse nicht, es tut einfach nichts. Ich teste es mit einem Datum wie "01.04.2014 11:37:00" (April) und ich bekomme am "result.Date" das Datum "04/01/2014 11:37:00" (Januar), vor und nach Parsing.

Die Frage ist also: Warum analysiert die Methode "DateTime.Parse" das Datum nicht korrekt?

UPDATE:

Hier ist der Code des SearchVM:

[ModelBinder(typeof(SearchVMBinder))] 
public class SearchVM 
{ 
    public DateTime Date { get; set; } 
    public string StudyCaseNumber { get; set; } 
    public string PatientNumber { get; set; } 
    public string PatientName { get; set; } 
    public string PatientFamilyName { get; set; } 
    public string PatientMothersMaidenName { get; set; } 
    public string DoctorName { get; set; } 
    public string RoomName { get; set; } 
    public E_OrderedBy OrderBy { get; set; } 

} 

und hier der Kopfzeile der Aktion des Controllers:

public ActionResult ListSearch(SearchVM searchFilter) 

Danke.

+0

Lassen Sie uns Ihren Code für das Modell sehen. –

+0

@MorgoZ Versuchen Sie, dateTime als UTC-String zu posten, damit Sie diese Lösung lösen können – praguan

+0

Können Sie versuchen, wie folgt: result.Date = DateTime.ParseExact (result.Date, "TT/MM/JJJJ", null); –

Antwort

0

Ok, aus irgendeinem Grund interpretierte die "Parse" -Methode das eingehende DateTime-Format nicht richtig, das war "MM/TT/JJJJ H: MM: ss", also musste ich die "ParseExact" -Methode verwenden es.

Jetzt funktioniert das perfekt für eine spanische Kultur Info:

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     SearchVM result = (SearchVM)base.BindModel(controllerContext, bindingContext); 
     try 
     { 
      if (result != null) 
      { 
       if (result.NullableDate != null) 
       {          
        result.NullableDate = DateTime.ParseExact(result.NullableDate.ToString(), "MM'/'dd'/'yyyy H:mm:ss", new CultureInfo("es-ES")); 
       } 
      } 

     } 
     catch(Exception e) 
     { 
      NLog.LogManager.GetCurrentClassLogger().Error("Error al hacer el Bind específico de SearchVM. ", e); 
     } 

     return result; 
    } 
0

Here we go:

Versuchen zu schreiben/senden Sie Ihre Datetime als UTC string: Sie wie folgt umwandeln:

DateTime startdate = TimeZoneInfo.ConvertTimeToUtc(input.startdate.Value); //Converting to UTC time from local time 

Hoffe, es hilft;)

0

so etwas wie dies würde Arbeit

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var testFormat = bindingContext.ModelMetadata.DisplayFormatString; 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     if (!string.IsNullOrEmpty(testFormat) && value != null) 
     { 
      DateTime testDate; 
      testFormat = testFormat.Replace("{0:", string.Empty).Replace("}", string.Empty); 
      // use the format specified in the testFormat attribute to parse the date 
      if(DateTime.TryParseExact(value.AttemptedValue, testFormat, new System.Globalization.CultureInfo("es-ES"), DateTimeStyles.None, out testDate);) 
      { 
       return testDate; 
      } 
      else 
      { 
       //if you want allow nulls 
       //date = DateTime.Now.Date; 
       //return date; 

       bindingContext.ModelState.AddModelError(
        bindingContext.ModelName, 
        string.Format("{0} is an invalid date format", value.AttemptedValue) 
       ); 
      } 
     } 

     return base.BindModel(controllerContext, bindingContext); 
    } 
0

Ihr Code funktioniert.

Siehe oben Antwort auf diese Frage: Convert DateTime from English to Spanish

Sie sagte:

Aber mit diesem Code die Parse nicht funktioniert, es einfach nichts tut. Ich teste es mit einem Datum wie "01.04.2014 11:37:00" (April) und ich bin bekommen bei der "result.Date" das Datum "04.01.2014 11:37: 00 "(Januar), vor und afert Analyse.

Das ist eine ganz bestimmte Art von nicht funktioniert - die Art, die das Ergebnis eines Gebietsunterschieds ist. Sie haben das Format "es-ES" verwendet.

https://www.bjelic.net/2011/01/26/coding/formatting-date-time-currency-in-various-cultures/

result.Date = 

    DateTime.Parse(result.Date.ToString(), 
    CultureInfo.GetCultureInfo("es-ES")); 

Das resultierende Datum wird nach Ihnen „2014.01.04 11.37.00“ und die es-ES locale ist TT/MM/JJJJ, so da Sie derzeit mit Englisch sind es macht die Umwandlung.