Я обновил MVC3-решение до MVC4. После миграции валидатор не работает.
Моя дата ввода, если я выбираю немецкий как язык, составляет "20.03.2013". Я получаю ошибку проверки в MVC4, но не в MVC3. Если я заменю формат от "20.03.2013" до "20/03/2013", он работает в MVC4, но не в MVC3; -)
Я устанавливаю культуру пользовательского интерфейса текущего потока в немецкий. Результат значений 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 → DD.MM.YYYY; en-en → DD/MM/YYYY; en-us → MM/DD/YYYY
У меня только намек на настройку текущей культуры, вот доказательство того, что это должно быть правильно, как есть. Этот код не попадает, когда валидаторы терпят неудачу, похоже, что это происходит на стороне клиента.
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);
Не влияет на валидаторы...