如何在将视图模型传递到具有不同路由的视图时使用RedirectToAction
本文关键字:视图 路由 RedirectToAction 模型 | 更新日期: 2023-09-27 18:28:46
我有一个ASP.NET MVC 3应用程序,其中有一个使用"Contact
"answers"ThankYou
"操作的"About
"控制器。我希望用户转到/about/contact
,填写表单,提交它,然后被带到/about/contact/thankyou
*页面,在那里将显示表单内容(也称为视图模型)。
**请注意,没有"联系人"控制器,如果可能的话,我也不想为此创建一个控制器。*
我使用RedirectToAction
来阻止重新提交(Post/Rerect/Get模式),使用TempData
来传递视图模型以感谢页面。我也可以使用TempData
来检查是否直接到达了感谢页面,并重定向回联系人表单页面(这样它就不会在网络分析中注册为"目标")
但有一件事我想不通,那就是如何使用不同的感谢页面路线,使其显示为/about/contact/thankyou
我这样做对吗?有更好的方法吗?
以下是AboutController
中的相关操作
<!-- language: c# -->
[RequireHttps]
public ActionResult Contact()
{
var viewModel = new ContactViewModel();
return View(viewModel);
}
[RequireHttps]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Contact(ContactViewModel viewModel)
{
if (!ModelState.IsValid)
{
return View(viewModel);
}
// not sure if this is the best way or how to redirect to /contact/thankyou
TempData["viewModel"] = viewModel;
return RedirectToAction("ThankYou");
}
[RequireHttps]
public ActionResult ThankYou()
{
var viewModel = TempData["viewModel"];
// upon direct access, viewModel will be null and missing, so redirect to Contact form
if (viewModel == null)
{
return RedirectToAction("Contact");
}
return View(viewModel);
}
您可以在默认路由之前定义一个自定义路由:
routes.MapRoute(
"contact",
"about/contact/thankyou",
new { controller = "About", action = "ThankYou" }
);
现在,当您导航到/about/contact
时,将执行Contact
GET操作(您必须重命名它,因为在代码中它被称为ContactUs
)。然后,用户填写表单并提交给Contact
POST操作。url暂时保持不变:/about/contact
。重定向后,执行ThankYou操作,url更改为/about/contact/thankyou
。