ASP.NET MVC3 – formato DateTime

Estou usando a ASP.NET MVC 3.
Meu ViewModel é assim:

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

Em vista, eu tenho algo parecido com isto:

 
@Html.EditorFor(model => model.StartDate)
@Html.ValidationMessageFor(model => model.StartDate)

StartDate é exibido no formato correto, mas quando eu altero seu valor para 19.11.2011 e submeto o formulário, recebo a seguinte mensagem de erro: “O valor ’19 .11.2011 ‘não é válido para StartDate.”

Qualquer ajuda seria muito apreciada!

Você precisa definir a cultura apropriada no elemento de globalização do seu arquivo web.config para o qual o dd.MM.yyyy é um formato datetime válido:

  

Por exemplo, esse é o formato padrão em alemão: de-DE .


ATUALIZAR:

De acordo com sua exigência na seção de comentários, você deseja manter a cultura en-US do aplicativo, mas ainda usar formatos diferentes para as datas. Isso pode ser feito escrevendo um fichário de modelo personalizado:

 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); } } 

que você irá registrar no Application_Start :

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

Com base no seu comentário, vejo que tudo o que você quer é um inglês atual, mas com um formato de data diferente (corrija-me se estiver errado).

O fato é que o DefaultModelBinder usa as configurações de cultura do servidor para dados de formulário. Assim, posso dizer que o servidor usa a cultura “en-US”, mas com um formato de data diferente.

Você pode fazer algo assim no Application_BeginRequest e pronto!

 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

  

Adicionado este código abaixo ao arquivo global.asax.cs

 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; } 

E adicionado o abaixo para web.config em

 ;