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

82
我正在使用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个回答

80

TempData是一个桶,你可以往里面丢一些只在接下来的请求中需要的数据。也就是说,任何你放到 TempData 中的东西都会在下一个请求完成后被丢弃。这对于一次性的消息非常有用,例如表单验证错误。需要注意的重要事项是,这适用于会话中的下一个请求,因此该请求可能在不同的浏览器窗口或选项卡中进行。

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

希望这有所帮助。


我实际上是用它来显示我已经删除的客户的名称...例如:我想要显示“客户XXX已删除”,而这个XXX是我使用TempData传递的。谢谢你为我解决了这个问题。 - Yasser Shaikh
这意味着严格来说它是有问题的,对吧?如果在设置临时数据的POST请求和随后依赖于它的GET请求之间发生另一个请求(例如来自另一个选项卡),则间歇性请求会夺走临时数据。虽然这不太可能发生,但仍需注意。 - John
1
我不会说它是有问题的。它是有意为之设计的,就像Yasser所问的那样。如果你的用户在一百万次操作中偶尔没有收到“客户已删除”的消息,这并不是世界末日,但我甚至怀疑这种情况是否会发生,因为这太不可能了。 - Display Name
你认为在TempData中保存大量文件是一个好的做法吗?我有100个新闻元素,它们被保存在TempData中,但我感觉这会减慢网站的速度。 - Burak Karakuş
1
我认为这不是一个好的做法。我会定义一些自己的结构并将其保留在那里。如果我是你,我会测量在tempdata中有多个项目、使用自己的结构和将自己的结构作为1个项目放在tempdata中时的性能。没有对错之分,但要进行测量并使用有效、高效且易于理解的方法。 - Display Name

72
请注意,从MVC 3开始,TempData的持久性行为已经改变,现在TempData中的值会在读取之前一直保留,并不仅限于下一个请求。
TempData的值会保留直到被读取或者直到session超时。以这种方式持久化TempData使得它可以用于多个请求,例如重定向等情况。详情请参考 https://msdn.microsoft.com/zh-cn/library/dd394711(v=vs.100).aspx

19

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

MVC Tempdata ,Peek和Keep混淆


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接