Проблема глобализации с использованием DateTime и привязки модели ASP.NET MVC 3 - PullRequest
2 голосов
/ 03 декабря 2010

Мое приложение работает с настройками культуры ro-RO, настроенными в разделе глобализации web.config.Если я выполняю запрос POST, например

POST /myapp/index
date=03-12-2010&value=something

, привязка модели сопоставляет это с правильным значением даты «03 декабря 2010», поскольку формат даты-времени по умолчанию для культуры ro-RO - dd-MM-гггг.Если я изменяю метод запроса на GET, передавая те же данные, значение даты в моем действии становится «12 марта 2010» (формат даты и времени MM-dd-гггг)

GET /myapp/index?date=03-12-2010&value=something

$.getJSON('/Home/Index', $('form').serialize(), function(d) {
            // ...
});
$.post('/Home/Index', $('form').serialize(), function(d) {
            // ...
}, 'json');

Так что в этом случае «getJson»«post» должен возвращать тот же результат, но я получаю разные результаты из-за разницы между датой и временем.

Как я могу включить один и тот же формат анализа для запросов GET?

Я знаю, что могу использоватьболее общий формат, например, yyyy-MM-dd для дат, но мне просто интересно, почему это происходит?

1 Ответ

13 голосов
/ 03 декабря 2010

Из моего предыдущего ответа на эту тему: Nullable DateTime Параметр никогда не привязывается при вызове действия

" Это преднамеренно. Все, что является частью URI (примечание«Униформа» в URI) интерпретируется так, как если бы она исходила из инвариантной культуры. Это значит, что пользователь в США, который копирует ссылку и отправляет ее через IM другу в Великобритании, может быть уверен, что его другсм. точно такую ​​же страницу (в отличие от HTTP 500, например, из-за ошибки преобразования DateTime). Как правило, даты, передаваемые в RouteData или QueryString, должны быть в формате yyyy-mm-dd, чтобы быть однозначнымив разных культурах .

Если вам нужно интерпретировать параметр QueryString или RouteData с учетом культурных особенностей, извлеките его как строку, а затем вручную преобразуйте в нужный тип, передавая желаемую культуру. (DateTime.Parse имеет перегрузки, которые позволяют указать культуру.) Если вы это сделаете, я также рекомендую взять желаемуюКультура в качестве параметра QueryString или RouteData, так что «универсальная» часть URI не теряется, например, URL будет выглядеть примерно так ...? culture = fr-fr & date = 01-10-1990."

...