15

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

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);
}

所有三个动作方法都在同一个控制器中。基本上,用户在联系表单中输入了一些数据,我想使用他们在模型对象中的名称将他们重定向到感谢页面。

正如代码一样,它可以工作,但是 URL 与 GET 变量一起传递。不理想。

http://localhost:7807/Contacto/Gracias?Nombre=Sergio&Apellidos=Tapia&Correo=opiasdf&Telefono=oinqwef&Direccion=oinqef&Pais=oinqwef&Mensaje=oinqwef

有什么建议么?

4

3 回答 3

38

听起来像是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);
}
于 2012-10-22T21:35:06.910 回答
2

而不是做

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 视图”

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

想法?

于 2012-10-22T21:39:07.427 回答
-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);
}
于 2012-10-22T21:37:23.667 回答