如何在将视图模型传递到具有不同路由的视图时使用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);
}

如何在将视图模型传递到具有不同路由的视图时使用RedirectToAction

您可以在默认路由之前定义一个自定义路由:

routes.MapRoute(
    "contact",
    "about/contact/thankyou",
    new { controller = "About", action = "ThankYou" }
);

现在,当您导航到/about/contact时,将执行ContactGET操作(您必须重命名它,因为在代码中它被称为ContactUs)。然后,用户填写表单并提交给Contact POST操作。url暂时保持不变:/about/contact。重定向后,执行ThankYou操作,url更改为/about/contact/thankyou