2011-10-20 22 views
28

Używam ASP.NET MVC 3.
My ViewModel wygląda następująco:ASP.NET MVC3 - format DateTime

public class Foo 
{ 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime StartDate { get; set; } 
    ... 
} 

Zważywszy, mam coś takiego:

<div class="editor-field"> 
    @Html.EditorFor(model => model.StartDate) 
    <br /> 
    @Html.ValidationMessageFor(model => model.StartDate) 
</div> 

StartDate wyświetla się w prawidłowym formacie, ale kiedy zmienię jego wartość na 19.11.2011 i prześlę formularz, pojawia się następujący komunikat o błędzie: "Wartość" 19 .11.2011 "nie jest poprawna dla StartDate."

Każda pomoc będzie bardzo ceniona!

Odpowiedz

41

trzeba ustawić właściwą kulturę w elemencie globalizacji pliku web.config dla których dd.MM.yyyy jest poprawnym formacie datetime:

<globalization culture="...." uiCulture="...." /> 

Dla przykładu, który jest domyślnym formatem w języku niemieckim: de-DE.


UPDATE:

zależności od zapotrzebowania w sekcji komentarzy, które chcesz przechowywać en-us kulturę aplikacji, ale nadal korzystać z różnych formatów dat. Może to zostać osiągnięte poprzez napisanie niestandardowego modelu Spoiwo:

using System.Web.Mvc; 
public class MyDateTimeModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var displayFormat = bindingContext.ModelMetadata.DisplayFormatString; 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     if (!string.IsNullOrEmpty(displayFormat) && value != null) 
     { 
      DateTime date; 
      displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty); 
      // use the format specified in the DisplayFormat attribute to parse the date 
      if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) 
      { 
       return date; 
      } 
      else 
      { 
       bindingContext.ModelState.AddModelError(
        bindingContext.ModelName, 
        string.Format("{0} is an invalid date format", value.AttemptedValue) 
       ); 
      } 
     } 

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

który będzie rejestrować w Application_Start:

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

Ale nie używam angielskiej kultury z innym formatem datetime. Czy istnieje jakieś obejście? –

+0

@ šljaker, tak jest. Będziesz musiał napisać niestandardowy segregator modelu i ręcznie przeanalizować parametr daty, używając formatu, który Ci się podoba. –

+0

Znacznik globalizacji jest dzieckiem znacznika . – encc

10

oparciu komentarzu widzę wszystko, co chcesz to angielski prąd, ale z innym terminem format (popraw mnie, jeśli się mylę).

Faktem jest, że DefaultModelBinder używa ustawień kultury serwera dla danych formularza. Mogę więc powiedzieć, że serwer używa kultury "en-US", ale z innym formatem daty.

Możesz zrobić coś takiego w Application_BeginRequest i gotowe!

protected void Application_BeginRequest() 
{ 
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString()); 
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy"; 
    System.Threading.Thread.CurrentThread.CurrentCulture = info; 
} 

Web.Config

<globalization culture="en-US" /> 
+1

to wszystko nie działa dla mnie :( – Andrei

+0

Dzięki za lot ... To działało dla mnie ... –

0

Dodany to poniżej kod do Global.asax.cs plik

protected void Application_BeginRequest() 
{   
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());  
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy"; 
    System.Threading.Thread.CurrentThread.CurrentCulture = info;  
} 

i dodaje poniżej web.config pod <system.web>

<globalization culture="en-US">;