2015-08-07 3 views
1

Я использую шаблон PRG (Post-Redirect-Get) в моем проекте MVC. Идея состоит в том, что вы не возвращаете представление из своего действия, а скорее на успешный POST, который вы перенаправляете на другое представление, полностью использующее Get (возможно, в базе данных), чтобы вернуть сохраненные значения и повторно отобразить их (подумайте о " Сохранить успешную ").MVC PRG pattern - прохождение модели вокруг

В моем случае у меня нет базы данных, чтобы сохранить сохраненные детали, и я хотел бы знать надежный способ хранения, а затем получить сохраненные данные на следующей странице.

я делал

RedirectToAction("Success", myViewModel) 

, который я понимаю, не так, не в последнюю очередь потому, что она имеет все значения в строке URL. Что мне нужно сделать, это

RedirectToAction("Success") 

, а затем каким-то образом получить значения обратно, построить ViewModel и дать его мнение.

Я знаю, что есть ViewBag, TempData, ViewData и Session, но без большого тестирования в различных сценариях. Я не знаю, какой из них подходит для моей ситуации. Статика, очевидно, не подходит для публичного сайта.

Если вы работаете с PRG без базы данных, каков способ сохранения данных? Или я могу просто бросить какую-то ошибку & перенаправить, если пользователь вернется & вперед?

Большое спасибо заранее.

EDIT: Пример сценария - страхование автомобиля. Пользователь посещает сайт, заполняет личные данные и хиты Submit. На следующей странице представлены параметры (сторонний, кражи, добровольный избыток и т. Д.), И при выборе их вызов через AJAX производится для получения котировки.

Все личные данные отправляются вместе с вариантами. Но нет учетной записи пользователя, и ничего не было записано в базу данных (Закон о защите данных - мы не храним данные, если только разрешение не получено, и запрос будет отключать людей, если они просто просматриваются).

ОБНОВЛЕНИЕ: Решение, на котором мы остановились, было следующим: Подробности Действие POST создает OptionViewModel. Он помещается в TempData. Вызывается RedirectToAction («Опции»). В акции Options мы получаем ViewModel

OptionsViewModel viewModel = (OptionsViewModel)TempData.Peek("MyViewModel"); // .Peek preserves the value 

Если ViewModel равна нулю, мы RedirectToAction() обратно к деталям. В противном случае мы вернем представление «Параметры».

ответ

1

Помимо создаваемой уродливой строки запроса, RedirectToAction("Success", myViewModel) может потерпеть неудачу, потому что (1) вы можете превысить ограничение строки запроса (которое вызовет исключение) или (2), если ваша модель содержит свойства, которые являются сложными объектами или наборами, эти свойства будут null в методе GET.

ViewBag и ViewData не подходит для передачи значений между методами - они предназначены для передачи данных из контроллера в представление (см this article)

Сво не понятно, почему у вас нет какого-то для постоянного хранения, но без него вам потребуется либо TempData, либо Session для временного хранения данных между запросами.

TempData использует Session но это длится только один запрос, так что если вы используете его, чтобы передать модель методу Success(), и пользователь обновляет браузер, модель будет null, хотя вы можете использовать .Peek или .Keep переопределить это поведение (см. this question/answer).

Лично я никогда не использовал Session (и использовал только TempData для передачи некритических данных, таких как одноразовое сообщение, указывающее на успех) и рассмотрел бы сохранение данных где-то, например, в XML-файле перед перенаправлением, чтобы он мог быть прочитайте снова в методе GET.

+0

Ваш ответ указал мне в правильном направлении, поэтому я счастлив принять это как ответ. Я добавил свое решение выше. – VictorySaber

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

  • Нет связанных вопросов^_^