asp.net-mvc-3 datetime

asp.net mvc 3 - ASP.NET MVC3-formato de fecha y hora



asp.net-mvc-3 datetime (3)

Estoy usando ASP.NET MVC 3.
Mi ViewModel se ve así:

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

En 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!


En base a su comentario, veo que todo lo que desea es una versión en inglés pero con un formato de fecha diferente (corríjanme si me equivoco).

El hecho es que 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.

¡Puedes hacer algo como esto en 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" />


Se agregó este código a continuación al archivo 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; }

Y agregó lo siguiente a web.config en <system.web>

<globalization culture="en-US">;


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

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

Por ejemplo, ese es el formato predeterminado en alemán: de-DE .

ACTUALIZAR:

De acuerdo con su requisito en la sección de comentarios, desea mantener la cultura en-US de la aplicación, pero aún así utilizar formatos diferentes para las fechas. Esto se puede lograr escribiendo una carpeta de modelo personalizada:

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 registrarás en Application_Start :

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