Вопрос

Я создаю обычную форму для входа в систему с помощью Html.RenderAction на каждой странице моего сайта.

Если пользователь вводит свои данные в текстовое поле и нажимает кнопку «Отправить», он выполняет POST для контроллера, который обрабатывает вход в систему.

Если они допустят ошибку, например, введут неверный адрес электронной почты, он заполнит ModelState сообщением об ошибке, а затем перенаправит обратно на любую страницу, на которой он был раньше.

Проблема в том, что RenderAction происходит как отдельный запрос, я теряю ViewModel.

Даже когда я помещаю его в TempData, он теряется, так как TempData сбрасывается при каждом отдельном запросе.

Есть ли способ сохранения данных между последовательными вызовами Html.RenderAction?

Если нет, какие-либо предложения о том, как я мог бы взломать это? (Должны ли данные помещаться в сессию?)

Это было полезно?

Решение

Вот что я сделал на данный момент. (Возможно, это не самое идеальное решение.)

Я создал «PreserveViewDataAttribute», в который я помещаю любое действие, для которого я хочу сохранить ViewData в сеансе.

В моем BaseController я переопределил метод 'Redirect' своим собственным методом, который выполняет следующие действия.

<Ол>
  • Получает ссылку на метод Action, который его вызвал (немного размышлений здесь)

  • Проверяет, определен ли для этого метода параметр PreserveViewDataAttribute

  • Если это так, копирует текущий ViewData в переменную Session. (Метка переменной совпадает с именем текущего действия, с добавлением _ViewData в конец.)

  • В любом случае вызывает базовый метод Redirect.

  • Затем я создал свойство в BaseController с именем «PreservedViewData», которое возвращает ViewData в сеансе, соответствующее текущему действию. (Или возвращает ноль, если не найден).

    Таким образом, чтобы сохранить ViewData столько, сколько я хочу, мне нужно только украсить свое действие с помощью PreserveViewDataAttribute, а затем вызывать PreservedViewData всякий раз, когда мне это нужно.

    Дайте мне знать, если вы хотите исходный код для этого.

    Другие советы

    Вам может понравиться подход этого пост-редиректа-получения от Кази Рашид.

    http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top