Передача объекта модели в 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