RedirectToAction меняет день и месяц на дату - PullRequest
1 голос
/ 24 февраля 2012

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

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

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

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

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

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

Чтобы проиллюстрировать, что у меня получилось немного лучше, у меня есть пользовательское связующее для модели DateTime

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);
}

При перенаправлении я обнаружил, что значение подшивки модели.AttemptedValue является неправильно отформатированной строкой.

1 Ответ

0 голосов
/ 25 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...