Проблема глобализации с привязкой модели DateTime и ASP.NET MVC 3

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

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

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

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?

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


person Vasea    schedule 03.12.2010    source источник


Ответы (1)


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

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

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

person Buildstarted    schedule 03.12.2010