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

时间:2012-03-21 17:41:28

标签: c# asp.net-mvc-3 viewmodel post-redirect-get

我有一个ASP.NET MVC 3应用程序,其常见情况是“About”控制器使用“Contact”和“ThankYou”操作。 我希望用户转到/about/contact,填写表单,提交表单,然后转到/about/contact/thankyou *页面,其中将显示表单内容(也称为视图模型)。

**注意没有“联系”控制器,如果可能,我也不想为此目的创建一个。*

我正在使用RedirectToAction来阻止重新提交(Post/Redirect/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);
}

1 个答案:

答案 0 :(得分:0)

您可以在默认路线之前定义自定义路线:

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

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