在不使用TempData

时间:2016-06-23 16:25:02

标签: asp.net asp.net-mvc-5

现在我正在做的是在将ViewModel传递给另一个Action时使用TempData。

但我的同事告诉我,我不应该使用TempData,因为他们在我们的LoadBalancers之前遇到了TempData的经验问题。

这是我的控制器的一部分,以便您可以看到我想要做的事情。 如何在不使用TempData或Session的情况下实现相同的过程。 请指教,谢谢!

public ActionResult Create()
{
    MyViewModel viewModel;

    if (TempData["viewModel"] != null)
    {
        viewModel = (MyViewModel)TempData["viewModel"];
        //code for getting dropdownlist to show to view

        return View(viewModel);
    }

    viewModel = new RequestViewModel();
    //code for getting dropdownlist to show to view

    return View(viewModel);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(MyViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        //collect data, but not yet save to database

        TempData["viewModel"] = viewModel;

        return RedirectToAction("Confirm");
    }

    //code to get errors, and dropdownlist items to re-show to view
    return View(viewModel);
}

public ActionResult Confirm()
{
    if (TempData["viewModel"] != null)
    {
        var viewModel = (MyViewModel)TempData["viewModel"];

        return View(viewModel);
    }

    return RedirectToAction("Create");
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Confirm(MyViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        //save data to database if confirmed

        return View(viewModel);
    }

    return RedirectToAction("Create");
}

- 编辑 -

我还尝试通过参数将viewModel传递给redirectToAction,但我的viewModel在重定向后没有重新填充。代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(MyViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        //collect data, but not yet save to database

        return RedirectToAction("Confirm", viewModel);
    }

    //code to get errors, and dropdownlist items to re-show to view
    return View(viewModel);
}

public ActionResult Confirm(MyViewModel viewModel)
{
    if (viewModel != null)
    {
        //some code

        return View(viewModel);
    }

    return RedirectToAction("Create");
}

[HttpPost]
[ActionName("Review")]
[ValidateAntiForgeryToken]
public ActionResult ConfirmPost(MyViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        //save data to database if confirmed

        return View(viewModel);
    }

    return RedirectToAction("Create");
} 

2 个答案:

答案 0 :(得分:2)

假设页面加载的检查方法除了返回视图之外什么都不做,你能不能使用

return View("Check", viewmodel);

答案 1 :(得分:0)

您遇到的问题是由于TempData使用服务器会话来存储其内容,这在多服务器环境中存在问题。您可以实现自己的tempdata提供程序,以使其使用cookie。一些可能的解决方案:

https://stackoverflow.com/a/28355862/1942895

https://brockallen.com/2012/06/11/cookie-based-tempdata-provider

http://vijayt.com/Post/Custom-TempDataProvider-for-Azure