27 votos

ASP.NET MVC3 - formato de fecha y hora

Estoy utilizando ASP.NET MVC 3.
Mi vista se ve así:

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 cambie su valor a 19.11.2011 y enviar el formulario, sale el siguiente mensaje de error: "el valor '19.11.2011' no es válido para StartDate."

Cualquier ayuda sería mucho apreció!

37voto

Darin Dimitrov Puntos 528142

Usted necesidad de establecer la adecuada cultura en la globalización de los elementos de tu web.archivo de configuración para que dd.MM.yyyy es válido formato de fecha:

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

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


ACTUALIZACIÓN:

Según su requisito, en la sección de comentarios que desea mantener en-US cultura de la solicitud, pero que todavía utilizan diferentes formatos de las fechas. Esto podría lograrse mediante la escritura de un cuaderno de modelo personalizado:

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

la cual deberá registrarse en Application_Start:

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

9voto

Mark Puntos 12663

Basado en tu comentario veo todo lo que quieren es un inglés actual pero con un formato de fecha diferentes (corríjanme si me equivoco).

El hecho es que la DefaultModelBinder utiliza los valores de la cultura del servidor de datos del formulario. Así que puedo decir la cultura de "en-US" de uso de servidor pero con un formato de fecha diferentes.

Se 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" />

0voto

rolc Puntos 23

Añade este código a continuación para el mundial.asax.cs archivo

protected void Application_BeginRequest()
{

CultureInfo info = new CultureInfo(del Sistema.Las operaciones de roscado.Subproceso.CurrentThread.CurrentCulture.ToString()); info.DateTimeFormat.ShortDatePattern = "dd.MM.aaaa"; Sistema.Las operaciones de roscado.Subproceso.CurrentThread.CurrentCulture = info;

}

y añadió el siguiente a la web.config bajo <sistema.web>

<la globalización de la cultura="es-es" />

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X