Ненавязчивый 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);
Не влияет на валидаторы ...