76

我正在使用 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();
}

那么TempDatahere的使用正确吗?我的意思是在最佳编程实践下,这是正确的使用方式TempData吗?

在什么实时情况下应该TempData使用?

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

谢谢

4

3 回答 3

75

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

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

希望这可以帮助。

于 2012-09-14T14:56:51.893 回答
66

请注意,从 MVC 3 开始,TempData 的持久性行为发生了变化,现在 TempData 中的值会一直保持到它被读取,而不仅仅是下一个请求。

TempData 的值会一直存在,直到它被读取或会话超时。以这种方式持久化 TempData 可以实现重定向等场景,因为 TempData 中的值在单个请求之外可用。 https://msdn.microsoft.com/en-in/library/dd394711%28v=vs.100%29.aspx

于 2015-06-30T10:21:06.553 回答
19

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

MVC Tempdata , Peek and Keep 混淆

于 2015-04-20T11:21:39.563 回答