Ведение ViewData между вызовами RenderAction - PullRequest
2 голосов
/ 11 сентября 2009

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 24 октября 2009

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

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

0 голосов
/ 11 сентября 2009

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

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

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

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

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

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

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

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

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

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

...