ViewData和TempData之间的区别?


94

我知道什么是ViewData并一直使用,但是在ASP.NET Preview 5中,他们引入了一个新的名称TempData。

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

那么,什么时候应该使用TempData代替ViewData?

是否有最佳做法?


我想在TempData这里添加一些内容stackoverflow.com/a/17199709/2015869
Imad Alazani 2013年

Answers:


94

一句话:TempData就像ViewData一样,只有一个区别:它们仅包含两个连续请求之间的数据,之后它们被销毁。您可以TempData用来传递错误消息或类似内容。

尽管已过时,但本文TempData生命周期有很好的描述。

正如本·谢尔曼(Ben Scheirman)在这里说的那样:

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


我认为这是一个很大的差异,TempData因为与方法之间传递的简单字典相比,涉及的内容(会话)可能要复杂得多
Matti Virkkunen 2012年

29

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


在相同情况下,是否会保留ViewData的值?
IsmailS,2011年

9
@Ismail:不,ViewData不会通过重定向保留数据。那是TempData的主要区别。
Mariano Desanze 2011年

5

ViewData:

  • ViewData 是字典类型 public ViewDataDictionary ViewData { get; set; }
  • 它只能用于将数据从控制器传递到视图
  • 生命只有在当前请求期间
  • 如果传递字符串,则无需打字
  • 如果传递对象,则需要进行类型转换,但在此之前,您需要检查它是否不为null
  • 它是的属性ControllerBase,它是Controllerclass 的父级

TempData:

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

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

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

详细查看MVC中ViewData,ViewBag,TempData和Session的比较



0

当我们要将数据从控制器传递到相应的视图时,将使用视图数据。查看数据的寿命很短,这意味着重定向发生时它将破坏。示例(控制器):

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>

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.