Передача объекта модели в RedirectToAction без загрязнения URL?
Вот что я пытаюсь сделать:
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(ContactModel model)
{
if (ModelState.IsValid)
{
// Send email using Model information.
return RedirectToAction("Gracias", model);
}
return View(model);
}
public ActionResult Gracias(ContactModel model)
{
return View(model);
}
Все три метода действий находятся в одном контроллере. В принципе, пользователь вводит некоторые данные в контактной форме, и я хочу перенаправить их на страницу с благодарностью, используя их имя в объекте Model.
Как и в коде, он работает, но URL-адрес передается вместе с переменными GET. Не идеально.
http://localhost:7807/Contacto/Gracias?Nombre=Sergio&Apellidos=Tapia&Correo=opiasdf&Telefono=oinqwef&Direccion=oinqef&Pais=oinqwef&Mensaje=oinqwef
Любые предложения?
Ответы
Ответ 1
Звучит как решение для TempData!
[HttpPost]
public ActionResult Index(ContactModel model)
{
if (ModelState.IsValid)
{
// Send email using Model information.
TempData["model"] = model;
return RedirectToAction("Gracias");
}
return View(model);
}
public ActionResult Gracias()
{
ContactModel model = (ContactModel)TempData["model"];
return View(model);
}
Ответ 2
Быстрый ответ - это не передача всей модели, а некоторый идентификатор, который вы можете использовать для извлечения модели из репозитория:
[HttpPost]
public ActionResult Index(ContactModel model)
{
if (ModelState.IsValid)
{
// Send email using Model information.
return RedirectToAction("Gracias", model.ID);
}
return View(model);
}
public ActionResult Gracias(int contactID)
{
ContactModel model = new ContractRepository().GetContact(contactID);
return View(model);
}
Ответ 3
Вместо того, чтобы делать
return RedirectToAction("Gracias", model);
Вы могли бы сделать
[HttpPost]
public ActionResult Index(ContactModel model)
{
if (ModelState.IsValid)
{
// Send email using Model information.
return View("Gracias", model);
}
return View(model);
}
и удалите действие контроллера Gracias. Используя выше, представление "Gracias" будет отображаться с вашей моделью ContactModel.
Я не вижу необходимости иметь отдельное действие контроллера, если он использует ту же модель и является частью шага блокировки рабочего процесса ex. "успешный POST для индекса всегда будет отображаться на экране Gracias View"
Вы также можете сохранить модель в TempData (которая похожа на состояние сеанса 1 запроса), но я не вижу смысла делать это в вашей ситуации, так как это просто усложняет вещи
Мысли?
Ответ 4
Не удалось ли это сделать без перенаправления?
Вот что у меня есть:
[HttpGet]
public ActionResult Contact()
{
return View();
}
[HttpPost]
public ActionResult Contact(EmailResponse response)
{
if(ModelState.IsValid){
return View("Thanks", response);
}
else
{
return View();
}
}
Вид "Thanks"
строго типизирован на EmailResponse