¿DateTime discreto? Validación en MVC4

Actualicé una solución MVC3 a MVC4. Después de la migración, el validador se rompe.

Mi fecha de entrada, si selecciono alemán como idioma, es "20.03.2013". Recibo un error de validación en MVC4, pero no en MVC3. Si sustituyo el formato de "20.03.2013" a "20/03/2013", funciona en MVC4, pero no en MVC3 ;-)

Puse la cultura UI del hilo actual a alemán. La salida de los valores de ResX está en el idioma correcto,así que sé que no debería haber ningún error con la cultura., sólo para el sitio en sí. Los mensajes de error están en inglés, pero el sitio está en alemán.

Supongo que esto significa que el validador utiliza la Cultura UI incorrecta.

Aquí está el código que utilizo.

[Required(ErrorMessageResourceName = "Error_DepartureDate", ErrorMessageResourceType = typeof(Resx.Query))]
public DateTime? DepartureDate { get; set; }

Supongo que hay algo mal con el cuaderno de modelos predeterminado, ya que el html representado se ve bien:

data-lang="de" data-mindate="3" data-val="true" data-val-required="Bitte geben Sie das gewünschte Reisedatum des Hinflugs ein." id="DepartureDate" name="DepartureDate" tabindex="3" type="text" value="" 

Actualicé el Jscript a las fuentes que se envían cuando creas una nueva aplicación Mvc usando las plantillas de Visual Studio 2012 (SP1 está instalado). Esto no tuvo ningún impacto.

Tengo un CultureModelBinder que lee la cultura actual fuera de la sesión y establece la cultura con una pequeña función de ayuda.

public static void UpdateThreadCulture(CultureInfo culture)
{
  Thread.CurrentThread.CurrentUICulture = culture;            
}        

La carpeta del modelo de cultura es la carpeta predeterminada.

ModelBinders.Binders.DefaultBinder = new CultureModelBinder();
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeModelBinder());
// and many, many more

¿Tal vez algo cambió en el orden de ejecución con mvc4 resultando el problema?

Actualización: el proyecto usa .NET Framework 4.5 como destino.

Actualización 2:

Tengo un cuadro combinado donde el usuario puede seleccionar 16 idiomas diferentes, cada uno puede tener su propio formato específico.

P.ej. DE-DE -> DD.MM.YYYY; en-en -> DD / MM / YYYY; en-us -> MM / DD / YYYY

Acabo de recibir una pista sobre cómo establecer la cultura actual, aquí está la prueba de que debe ser correcta. Este código no se golpea cuando fallan los validadores, parece que sucede en el lado del cliente.

   public class DateTimeModelBinder : IModelBinder
    {
        private LogService _log = new LogService();

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {            
            object result = null;
            ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (valueResult != null)
            {
                try
                {
                    var stateHandler = new StateHandler(controllerContext.HttpContext.Session);                    
                    result = valueResult.ConvertTo(typeof(DateTime?), stateHandler.Culture);                                       
                }
                catch
                {
                    try
                    {
                        result = valueResult.ConvertTo(typeof(DateTime?), CultureInfo.InvariantCulture);
                    }
                    catch (Exception ex)
                    {
                        _log.Error("DateTimeModelBinder parse exception", ex);
                        _log.KeyValue("AttemptedValue", valueResult.AttemptedValue);                                           
                    }                    
                }
            }
            return result;
        }
    }

y para completar mi modelo de carpeta de la cultura:

  public class CultureModelBinder : DefaultModelBinder
    {      
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            StateHandler stateHandler = new StateHandler(controllerContext.HttpContext.Session);
            Helper.UpdateThreadCulture(stateHandler.Culture);

            return base.BindModel(controllerContext, bindingContext);
        }        
    }

Actualización: Tal vez haya una correlación con este problema:http://connect.microsoft.com/VisualStudio/feedback/details/705643/a-data-val-date-attribute-is-generated-for-time-fields-in-asp-net-mvc-4

Actualización: Lea el siguiente artículo:http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx

Intenté lo siguiente:

Cargado los scripts en el siguiente orden:

/Scripts/jquery-1.8.3.min.js
/Scripts/globalize.js
/Scripts/cultures/globalize.cultures.js
// and much more other scripts...

Agregó la llamada. La salida fue correctamente "DE".

        var currentLanguage = $("#DepartureDate").attr("data-lang");
        alert(currentLanguage);       
        $.preferCulture(currentLanguage);

No afecta a los validadores ...

Respuestas a la pregunta(5)

Su respuesta a la pregunta