ViewData和TempData之间的区别?

asp.net-mvc

39696 观看

6回复

13033 作者的声誉

我知道ViewData是什么并且一直使用它,但在ASP.NET Preview 5中他们引入了一些名为TempData的新东西。

我通常强烈地键入我的ViewData,而不是使用对象字典方法。

那么,我何时应该使用TempData而不是ViewData?

对此有什么最佳做法吗?

作者: Elijah Manor 的来源 发布者: 2008 年 10 月 6 日

回应 (6)


91

2749 作者的声誉

决定

用一句话来说:TempData就像ViewData有一点不同:它们只包含两个连续请求之间的数据,之后它们被销毁。您可以使用TempData传递错误消息或类似的东西。

虽然过时,但本文TempData生命周期有很好的描述。

正如本·谢里曼在这里所说:

TempData是一个会话支持的临时存储字典,可用于单个请求。在控制器之间传递消息非常棒。

作者: Dragan Panjkov 发布者: 06.10.2008 09:16

28

2824 作者的声誉

当操作返回RedirectToAction结果时,它会导致HTTP重定向(相当于Response.Redirect)。在单个HTTP重定向请求期间,数据可以保留在控制器的TempData属性(字典)中。

作者: Captain Sensible 发布者: 20.01.2009 09:23

4

1507 作者的声誉

我发现这个比较很有用:http//www.dotnet-tricks.com/Tutorial/mvc/9KHW190712-ViewData-vs-ViewBag-vs-TempData-vs-Session.html

我遇到的一个问题是TempData值在默认读取后被清除。有选项,请参阅Msdn上的'Peek'和'Keep'方法以获取更多信息

作者: testpattern 发布者: 03.10.2014 09:00

5

12063 作者的声誉

ViewData的:

  • ViewData 是字典类型 public ViewDataDictionary ViewData { get; set; }
  • 它可用于将数据从控制器传递到视图,仅限于一种方式
  • 它的生命只在当前的要求中存在
  • 如果传递字符串则无需进行类型转换
  • 如果传递对象然后你需要对它进行类型转换,但在此之前你需要检查它是否为空
  • 它是一个属性ControllerBase,是Controller类的父类

TempData的:

  1. TempData内部使用TempDataDictionarypublic TempDataDictionary TempData { get; set; }
  2. 将数据保存到TempDataDictionary对象后:
    • 它会持续存在,可以从任何视图或任何控制器中的任何操作中读取
    • 它只能读一次; 一旦阅读,它就变为空
    • 它被保存到会话中,因此在会话数据到期时会丢失。

此行为是ASP.NET MVC 2及更高版本的新增功能。在早期版本的ASP.NET MVC中,值TempData仅在下一个请求之前可用。

  1. 它一直存在,直到它被读取或会话到期并且可以从任何地方读取。

详细了解MVC中ViewData,ViewBag,TempData和Session的比较

作者: Ali Adravi 发布者: 14.06.2017 07:34

0

1 作者的声誉

当我们想要将数据从控制器传递到相应的视图时,使用视图数据。查看数据的生命周期很短,这意味着它会在重定向发生时销毁。实施例(控制器):

public ViewResult try1()
    {
        ViewData["DateTime"] = DateTime.Now;
        ViewData["Name"] = "Mehta Hitanshi";
        ViewData["Twitter"] = "@hitanshi";
        ViewData["City"] = "surat";
        return View();
    }

try1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@ViewData["Name"]</td>
    <td>@ViewData["Twitter"]</td>
    <td>@ViewData["City"]</td>
</tr>
</table> 

TempData在控制器之间或操作之间传输数据。它用于存储一次性消息,它的生命非常短。我们可以使用TempData.Keep()使其通过所有操作可用或使其持久化。

实施例(控制器):

public ActionResult try3()
    {
        TempData["DateTime"] = DateTime.Now;
        TempData["Name"] = "Ravina";
        TempData["Twitter"] = "@silentRavina";
        TempData["Email"] = "Ravina12@gmail.com";
        TempData["City"] = "India";
        TempData["MobNo"] = 9998975436;
        return RedirectToAction("TempView1");
    }
    public ActionResult TempView1()
    {
        return View();
    }

TempView1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@TempData["Name"]</td>
    <td>@TempData["Twitter"]</td>
    <td>@TempData["Email"]</td>
    <td>@TempData["City"]</td>
    <td>@TempData["MobNo"]</td>
</tr>
</table>
作者: Hitanshi Mehta 发布者: 22.07.2018 11:34

0

685 作者的声誉

只是对TempData的旁注。
存储中的数据直到下一个请求才存储,但直到调用下一个读操作为止!
请参阅:
TempData在第二次请求后不会销毁

作者: nvirth 发布者: 16.02.2019 10:31
32x32