将模型对象传递给RedirectToAction而不会污染URL?

时间:2012-10-22 21:29:47

标签: c# asp.net-mvc-3 model controller

这是我正在尝试做的事情:

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

有什么建议吗?

4 个答案:

答案 0 :(得分:28)

听起来像是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);
}

答案 1 :(得分:0)

而不是做

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的锁定步骤部分,我认为不需要单独的控制器操作。 “成功发布到索引将始终导致显示Gracias视图”

您还可以将模型存储在TempData中(这类似于1个请求会话状态)但我认为在您的情况下没有任何意义,因为它只会使事情复杂化

思想?

答案 2 :(得分:-1)

快速回答是不要传递整个模型,而是可以使用一些标识符从存储库中检索模型:

[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 :(得分:-1)

如果没有重定向,这是否可以轻松完成?

这就是我所拥有的:

    [HttpGet]
    public ActionResult Contact()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Contact(EmailResponse response)
    {
        if(ModelState.IsValid){
            return View("Thanks", response);
        }
        else
        {
            return View();
        }
    }

"Thanks"视图强类型为EmailResponse