2012-02-24 4 views
1

У меня есть действие POST контроллера, которое перенаправляется на метод GET с использованием RedirectToAction.RedirectToAction меняет день и месяц на дату

return RedirectToAction(SomeActionName, new { date = someModel.someUTCDate }); 

Я выполнил заказ модели связующее вещество, которое разбирает даты, используя предполагаемую культуру и часовой пояс информацию, поэтому я перехватывать это правильно. Основные шаги в моей проблеме:

  1. POST действие вызывается с указанием даты/времени строки, которая GMT стандартное время, если не указано иное
  2. Обычай модель связующий разбирает эту дату в DateTime с Вида Utc, и это правильно связаны в правильном формате модели
  3. POST-действие перенаправляет на GET используя RedirectToAction с датой, которая была связана со временем UTC на модели
  4. MVC3 теперь пытается связать строковое значение DateTime с месяцем и днем ​​обменивается

Где-то между вызовом RedirectToAction и повторением значения DateTime для действия GET происходит преобразование строк, которое, по-видимому, меняет месяц и день.

Есть ли простой способ обеспечить правильное преобразование строк без накладных расходов, связанных с необходимостью его вручную конвертировать для каждого вызова RedirectToAction? Мне бы очень хотелось узнать, где происходит это значение маршрута для преобразования строк, и могу ли я повлиять на него для правильного преобразования строк.

Для того, чтобы проиллюстрировать то, что у меня есть немного лучше, у меня есть обычай DateTime модельную Binder

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

    if (value == null || string.IsNullOrEmpty(value.AttemptedValue) || value.AttemptedValue == "null") 
    { 
     return null; 
    } 

    return FormatHelper.ConvertStringFromGMT(value.AttemptedValue); 
} 

О перенаправлении Я нахожу, что value.AttemptedValue Типовом вяжущего является неправильно отформатированная строка.

+0

Вы имеете в виду, что SomeActionName имеет дату как параметр, и эта дата не связана правильно? –

+0

Я имею в виду, что SomeActionName имеет дату как параметр и что мое пользовательское связующее устройство получает неверно отформатированную строку для привязки для этого значения. Я указываю значение DateTime для параметра date, и оно преобразуется в строковое значение где-то в MVC, который неправильно отформатирован. –

+0

Я думаю, что преобразование выполняется в ModelBinder перед привязкой к вашему параметру действия. Класс DefaultModelBinder использует разные настройки культуры для выполнения преобразований типов из разных областей данных запроса . Значения, полученные из URL-адресов (данные строки маршрутизации и строки запроса), преобразуются с использованием анализа, нечувствительного к культуре, но значения, полученные из данных формы, преобразуются с учетом культуры в учетную запись . –

ответ

0

Ну, проблема решена. Насколько я могу судить, когда MVC получает значения маршрута для вашего перенаправления, значения маршрута преобразуются в параметры строки запроса с использованием инвариантной культуры. Это просто какая-то магия, которая происходит за кулисами. Мое решение этой проблемы состояло в том, чтобы переопределить методы контроллера RedirectToAction и RedirectToActionPermanent (перегрузки, которые берут RouteValueDictionary). Я перебираю RouteValueDictionary и конвертирую любые типы дат здесь, используя определенную информацию о культуре и часовом поясе. К счастью, все мои контроллеры уже наследовали от пользовательского базового контроллера, поэтому исправление было простым в реализации.

+0

Можете ли вы показать, как переопределить RedirectToAction для преобразования типов дат? У меня такая же проблема, но я не могу найти, как преобразовать типы дат, оставляя логику по умолчанию для других типов нетронутыми. – Magnus

Смежные вопросы