Ненавязчивый DateTime? Валидация в MVC4

Я обновил решение MVC3 до MVC4. После миграции валидатор не работает.

Моя дата ввода, если я выберу немецкий язык как «20.03.2013». Я получаю ошибку проверки в MVC4, но не в MVC3. Если я заменю формат с «20.03.2013» на «20.03.2013», он будет работать в MVC4, но не в MVC3 ;-)

Я установил UI-культуру текущего потока на немецкий. Вывод значений ResX на правильном языке,так что я знаю, что с культурой не должно быть ошибок., только для самого сайта. Сообщения об ошибках на английском языке, но сайт на немецком языке.

Я предполагаю, что это означает, что валидатор использует неправильную культуру пользовательского интерфейса.

Вот код, который я использую.

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

Я предполагаю, что с компоновщиком модели по умолчанию что-то не так, так как визуализированный HTML выглядит хорошо:

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="" 

Я обновил Jscript до тех источников, которые поставляются при создании нового приложения Mvc с использованием шаблонов Visual Studio 2012 (SP1 установлен). Это не имело никакого влияния.

У меня есть CultureModelBinder, который считывает текущую культуру из сессии и устанавливает культуру с помощью небольшой вспомогательной функции.

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

Связыватель модели культуры является связывателем по умолчанию.

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

Может быть, что-то изменилось в порядке выполнения с mvc4, что привело к проблеме?

Обновление: проект использует .NET Framework 4.5 в качестве цели.

Обновление 2:

У меня есть поле со списком, где пользователь может выбрать 16 различных языков, каждый из которых может иметь свое специфическое форматирование.

Например. DE-de -> ДД.ММ.ГГГГ; en-en -> ДД / ММ / ГГГГ; en-us -> ММ / ДД / ГГГГ

Я только что получил подсказку о настройке текущей культуры, вот доказательство того, что она должна быть правильной, как есть. Этот код не срабатывает при сбое валидаторов, похоже, что это происходит на стороне клиента.

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

и для полноты моей связующей модели культуры:

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

Обновление: возможно есть корреляция с этой проблемой:http://connect.microsoft.com/VisualStudio/feedback/details/705643/a-data-val-date-attribute-is-generated-for-time-fields-in-asp-net-mvc-4

Обновление: прочитайте следующую статью:http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx

попробовал следующее:

Загружены скрипты в следующем порядке:

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

добавил звонок. вывод был правильно "DE".

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

Не влияет на валидаторы ...

Ответы на вопрос(5)

Ваш ответ на вопрос