Ведение ViewData между вызовами RenderAction
-
05-07-2019 - |
Вопрос
Я создаю обычную форму для входа в систему с помощью 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