将模型对象传递给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
有什么建议?
听起来像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); }
快速回答是不传递整个模型,而是可以使用一些标识符从存储库中检索模型:
[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); }
而不是做
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请求会话状态)但我认为在您的情况下没有任何意义,因为它只会使事情复杂化
思考?
没有重定向,这不是很容易做到的吗?
这就是我所拥有的:
[HttpGet] public ActionResult Contact() { return View(); } [HttpPost] public ActionResult Contact(EmailResponse response) { if(ModelState.IsValid){ return View("Thanks", response); } else { return View(); } }
"Thanks"
视图是EmailResponse
强类型