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


72

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

注意:我已经通过以下链接

谢谢

Answers:


74

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

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

希望这可以帮助。


m实际上使用它来显示我已删除的客户的名称...例如::Customer XXX deleted是我要显示的内容,而我正在使用TempData传递的XXX。感谢您为我清除此问题。
Yasser Shaikh 2012年

这意味着严格来说它是坏的,对吗?如果在设置临时数据的帖子和依赖该临时数据的后续获取之间发生了另一个请求(例如,从另一个选项卡),则间歇性请求会抢走临时数据。这并非可能发生,但仍然如此。
约翰

1
我不会叫它坏了。它的设计是出于某种原因,例如Yasser正在询问。如果一百万次您的用户没有收到“删除客户”的消息,那不是世界末日,但是我什至怀疑它是否会发生,这太不可能了。
显示名称

您认为在TempData中保留一大堆文件是一种好习惯吗?我有100个新闻提要元素,它们都保存在TempData中,但是我感觉它会使网站变慢。
BurakKarakuş15年

1
我认为这不是一个好习惯。我将定义自己的某种结构并将其保留在那里。在您的鞋子中,我要衡量性能,其中在tempdata中有多个项目,您自己的结构以及在tempdata中具有您自己的结构作为一项。没有对与错的方法,但是要进行测量并使用有效的方法,执行的操作和易于理解的方法
显示名称

63

请注意,从MVC 3开始,TempData的持久行为已更改,现在TempData中的值一直保持到读取为止,而不仅仅是下一个请求。

TempData的值一直保持到读取或会话超时为止。以这种方式持久保存TempData可以实现诸如重定向之类的方案,因为TempData中的值可用于单个请求之外。 https://msdn.microsoft.com/zh-in/library/dd394711%28v=vs.100%29.aspx


17

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

MVC Tempdata,窥视并保持混乱

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.