2012-03-22 14 views
8

Estoy teniendo una pesadilla de tiempo con Dates. Estamos basados ​​en el Reino Unido, por lo que nuestro formato de fecha es dd/MM/aaaa. Esto es lo que los usuarios escribirán en el formulario cuando quieran una fecha determinada. Tengo un formulario que acepta tal propiedad. Obviamente es un tipo de fecha y hora. Deseo enviar este formulario al controlador en un GET, para que el usuario tenga una buena URL a la que pueda guardar el envío, etc. La vista también necesita vincular un marcador de fecha de la interfaz de usuario de JQuery a este elemento también. También necesitará el elemento de formulario que tener un cierto id y class por lo que realmente necesita para hacer esto a la forma de este modo:Enlace en-GB fechas en HTTP OBTENGA

@Html.TextBoxFor(model => model.ReturnDate, new { Class = "date", id = "ReturnDate" }) 

he especificado una variante de la cultura del Reino Unido en el web.config:

<globalization uiCulture="en" culture="en-GB"/> 

Parece que, como se explica aquí (http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx), cuando OBTENER una acción de controlador que MVC ignora la variante de cultivo y se establece por defecto en EE. UU. (Obviamente no existe fuera de los EE. UU., Esto está bien para Microsoft, despotrica) no ayuda porque significa que tendré que configurarlo para en cada fecha en cada modelo!

Esto significa que si un usuario escribe 01/05/2012 termino con 05/01/2012 que es incorrecto!

He visto varias soluciones a este problema, pero ninguna realmente se ajusta a lo que necesito. Necesito una forma para que Todas las fechas enviadas a través de un GET estén en formato BRITÁNICO. Estamos basados ​​únicamente en el Reino Unido, por lo que no se ingresarán formatos de Reino Unido.

Realmente no quiero crear y editar editor a menos que sea una forma de hacerlo sin una View/Viewmodel adjuntada a este Editor, ya que se utilizará de forma difícil para usar esto en todos los lugares donde tenemos un selector de fecha.

¡Toda la ayuda será recibida con gratitud!

+0

¿cómo la publicación a la que se ha vinculado no resuelve su problema? – Jon

+0

Por lo que puedo ver, ¿tendría que hacer esto para cada parámetro de cadena de consulta? (bindingContext.HttpContext.Request.QueryString ["theDate"];) esto no es práctico. – Liam

+1

si implementa el archivador de modelo personalizado, afectará la forma en que ingresan las fechas en su aplicación a lo largo de toda la aplicación, en cadenas de consulta, datos de formularios, cookies, etc. – Jon

Respuesta

10

Tienes una solución, gracias a @ Jon para los punteros:

public class GBDateModelBinder : IModelBinder 
{ 

    #region IModelBinder Members 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     string dateString = controllerContext.HttpContext.Request.QueryString[bindingContext.ModelName]; 
     if (string.IsNullOrEmpty(dateString)) 
       dateString = controllerContext.HttpContext.Request.Form[bindingContext.ModelName]; 
     DateTime dt = new DateTime(); 
     bool success = DateTime.TryParse(dateString, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dt); 
     if (success) 
     { 
      return dt; 
     } 
     else 
      { 
      return null; 
     } 
    } 

    #endregion 
} 

continuación registro en el Global.asax:

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

ACTUALIZACIÓN

alterado esta para permitir la mismo problema cuando se realiza la POST!

+0

¿Dónde pongo este GBDateModelBinder: clase IModelBinder? – KayGee

+0

¿No importa? Es una clase. Siempre que pueda acceder a él en globals.asax para registrarlo donde lo ubique, depende de usted. – Liam

2

Además de la respuesta de Liam: (!)

Para aquellos que todavía están teniendo este problema y están tratando de unirse a una anulable DateTime, asegúrese de que se registra el tipo correcto en global.asax:

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder()); 
ModelBinders.Binders.Add(typeof(DateTime?), new GBDateModelBinder()); 

¡Me ha dejado perplejo durante 15 minutos!

Cuestiones relacionadas