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

Posted

技术标签:

【中文标题】在 ASP.NET MVC 中使用 Tempdata - 最佳实践【英文标题】:Using Tempdata in ASP.NET MVC - Best practice 【发布时间】:2012-09-07 12:35:51 【问题描述】:

我正在使用 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

注意:我浏览了以下链接

When to use TempData vs Session in ASP.Net MVC http://www.gregshackles.com/2010/07/asp-net-mvc-do-you-know-where-your-tempdata-is/

谢谢

【问题讨论】:

【参考方案1】:

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

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

希望这会有所帮助。

【讨论】:

m 实际上使用它来显示我已删除的客户的名称...例如:Customer XXX deleted 是我想要显示的内容,而我正在使用 TempData 传递这个 XXX。谢谢你帮我解决这个问题。 这意味着严格来说它已经坏了,对吧?如果在设置临时数据的帖子和依赖它的后续获取(例如,从另一个选项卡)之间发生另一个请求,则间歇性请求会抢走临时数据。并不是说这很可能会发生,但仍然会发生。 我不会说它坏了。它以这种方式设计是有原因的,并且适用于 Yasser 所询问的情况。如果您的用户一百万次没有收到“客户已被删除”的消息,这并不是世界末日,但我什至怀疑它是否会发生,它太不可能考虑了。 您认为在 TempData 中保留大量文件是一种好习惯吗?我有 100 个新闻源元素,它们保存在 TempData 中,但我感觉它会减慢网站速度。 我认为这不是一个好习惯。我会定义一些我自己的结构并将其保留在那里。在你的鞋子里,我会衡量在 tempdata 中有多个项目、你自己的结构和在 tempdata 中有你自己的结构作为 1 个项目的性能。没有正确和错误的方法,但要进行测量并使用有效、执行且易于理解的方法【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

MVC Tempdata , Peek and Keep confusion

【讨论】:

以上是关于在 ASP.NET MVC 中使用 Tempdata - 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 和 Angularjs 与 ASP.NET MVC 和 Reactjs

在 ASP.NET 中使用 WebAPI 或 MVC 返回 JSON

在ASP.NET MVC中使用DropDownList

七天学会ASP.NET MVC ——ASP.NET MVC 数据传递

七天学会ASP.NET MVC ——ASP.NET MVC 数据传递

如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x