在ASP.NET MVC中使用Tempdata - 最佳实践

时间:2012-09-14 10:44:31

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 tempdata

我使用ASP.NET MVC 3来构建Web应用程序。

我想要做的是在两个控制器之间传递值,虽然有很多方法可以做到这一点我特别感兴趣的是使用TempData

public ActionResult Action1()
{
    string someMessage;
    Test obj = SomeOperation();
    if(obj.Valid)
    {
        someMessage = obj.UserName;
    }
    else
    {
        someMessage = obj.ModeratorName;
    }

    TempData["message"] = someMessage;

    return RedirectToAction("Index");
}

public ActionResult Index()
{
    ViewBag.Message = TempData["message"]

    return View();
}

这里使用TempData是正确的吗?我的意思是在最好的编程实践中,这是使用TempData的正确方法吗?

在什么时候应该使用TempData个案例?

注意:我已经浏览了以下链接

由于

3 个答案:

答案 0 :(得分:67)

TempData是一个存储桶,您可以在其中转储仅对以下请求所需的数据。也就是说,在下一个请求完成后,您放入TempData的任何内容都将被丢弃。这对于一次性消息很有用,例如表单验证错误。需要注意的重要一点是,这适用于会话中的下一个请求,因此请求可能发生在不同的浏览器窗口或选项卡中。

回答您的具体问题:没有正确的方法可以使用它。这完全取决于可用性和便利性。如果它有效,有意义,而其他人则相对容易理解,这很好。在你的特殊情况下,以这种方式传递参数很好,但你需要这样做很奇怪(代码味道?)。我宁愿在资源(如果它是资源)或数据库中保留这样的值(如果它是持久值)。根据您的使用情况,它似乎是一种资源,因为您将其用于页面标题。

希望这有帮助。

答案 1 :(得分:54)

请注意,MVC 3以后TempData的持久性行为已经改变,现在TempData中的值一直持续到读取为止,而不仅仅是下一个请求。

  

TempData的值一直持续到读取或会话为止   超时以这种方式保持TempData可以启用诸如的方案   重定向,因为TempData中的值超出了a   单一请求。   https://msdn.microsoft.com/en-in/library/dd394711%28v=vs.100%29.aspx

答案 2 :(得分:16)

请注意TempData持久性,这有点棘手。例如,如果您甚至只是在当前请求中读取TempData,它将被删除,因此您没有它用于下一个请求。相反,您可以使用Peek方法。我建议阅读这篇很酷的文章:

MVC Tempdata , Peek and Keep confusion