ViewData和TempData之间的区别?

时间:2008-10-06 03:57:42

标签: asp.net-mvc

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

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

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

对此有什么最佳做法吗?

6 个答案:

答案 0 :(得分:91)

在一句话中:TempData与ViewData类似,但有一点不同:它们只包含两个连续请求之间的数据,之后它们被销毁。您可以使用TempData传递错误消息或类似内容。

虽然已过时,this articleTempData生命周期有很好的描述。

正如Ben Scheirman所说here

  

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

答案 1 :(得分:29)

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

答案 2 :(得分:5)

<强>的ViewData:

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

TempData:

  1. TempData在内部使用TempDataDictionarypublic TempDataDictionary TempData { get; set; }
  2. 将数据保存到TempDataDictionary对象后:
    • 它会持续存在,可以从任何视图或任何控制器中的任何操作中读取
    • 只能读一次;一旦阅读,它就会变为空白
    • 保存到会话中,因此会话数据到期时会丢失。
  3. 此行为是ASP.NET MVC 2及后续版本的新增功能。 在早期版本的ASP.NET MVC中,TempData中的值仅在下一个请求之前可用。

    1. 它一直存在,直到它被读取或会话过期,并且可以从任何地方读取。
    2. See the comparison of ViewData, ViewBag, TempData and Session in MVC in detail

答案 3 :(得分:4)

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

我遇到的一个问题是TempData值在默认读取后被清除。有选项,see methods 'Peek' and 'Keep' on Msdn for more info

答案 4 :(得分: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>

答案 5 :(得分:0)

只是TempData的附带说明。
直到下一个请求才存储其中的数据,直到下一个读取操作被调用!
参见:
TempData won't destroy after second request