2011-10-20 20 views
28

estoy usando ASP.NET MVC 3.
Mi modelo de vista se parece a esto:ASP.NET MVC3 - formato DateTime

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

A la vista, tengo algo como esto:

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

StartDate se muestra en el formato correcto, pero cuando cambio su valor al 19.11.2011 y envíe el formulario, aparece el siguiente mensaje de error: "El valor '19 .11.2011 'no es válido para StartDate."

¡Cualquier ayuda sería muy apreciada!

Respuesta

41

Es necesario configurar la cultura adecuada en el elemento de la globalización de su archivo web.config para el que dd.MM.yyyy es un formato de fecha y hora válida:

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

por ejemplo, que es el formato por defecto en alemán: de-DE.


ACTUALIZACIÓN:

De acuerdo con su requisito en la sección de comentarios que desea mantener la cultura en-US de la aplicación, pero todavía utilizan un diferentes formatos para la fecha. Esto podría lograrse mediante la escritura de un modelo personalizado de aglutinante:

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

los que se registrará en Application_Start:

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

Pero no uso la cultura inglesa con diferentes formatos de fecha y hora. ¿Hay algún trabajo alrededor? –

+0

@ šljaker, sí, hay. Deberá escribir un archivador de modelo personalizado y analizar manualmente el parámetro de fecha con el formato que desee. –

+0

La etiqueta de globalización es hija de la etiqueta . – encc

10

Basado en su comentario que veo que todo lo que quiero es una corriente de Inglés, pero con una fecha diferente formato (corrígeme si estoy equivocado).

El hecho es que el DefaultModelBinder usa la configuración cultural del servidor para los datos del formulario. Entonces puedo decir que el servidor usa la cultura "en-US" pero con un formato de fecha diferente.

Puede hacer algo como esto en el Application_BeginRequest ¡y listo!

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

es todo lo que no funciona para mí :( – Andrei

+0

Muchas gracias ... Me funcionó ... –

0

añadido este código a continuación a global.asax.cs archivo

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

Y añade el siguiente a web.config bajo<system.web>

<globalization culture="en-US">;