Asp.net mvc ViewData和TempData之间的差异?

Asp.net mvc ViewData和TempData之间的差异?,asp.net-mvc,Asp.net Mvc,我知道什么是ViewData,并且一直在使用它,但是在ASP.NET Preview 5中,他们引入了一种新的称为TempData的东西 我通常会强力键入ViewData,而不是使用对象字典方法 那么,什么时候应该使用TempData而不是ViewData呢 这方面有什么最佳实践吗 在一句话中:TempData类似于ViewData,但有一个区别:它们只包含两个连续请求之间的数据,然后被销毁。您可以使用TempData传递错误消息或类似信息 虽然已经过时,但它对TempData生命周期有很好的描

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

我通常会强力键入ViewData,而不是使用对象字典方法

那么,什么时候应该使用TempData而不是ViewData呢


这方面有什么最佳实践吗

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

虽然已经过时,但它对
TempData
生命周期有很好的描述

正如本·谢尔曼所说:

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


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

我发现这个比较很有用:


我遇到的一个难题是TempData值在默认情况下读取后会被清除。有选项。

查看数据:

  • ViewData
    是字典类型
    publicviewdatadictionary ViewData{get;set;}
  • 它只能单向用于将数据从控制器传递到视图
  • 它的生命只在当前请求期间存在
  • 如果传递字符串,则无需进行类型转换
  • 若传递对象,那个么您需要对其进行类型转换,但在此之前,您需要检查它是否为null
  • 它是
    ControllerBase
    上的一个属性,它是
    Controller
    类的父级
TempData:

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

  • 它一直处于活动状态,直到它被读取或会话过期,并且可以从任何地方读取

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

    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> 
    
    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>
    
    
    名称
    啁啾
    电子邮件
    城市
    可移动的
    @TempData[“名称”]
    @TempData[“Twitter”]
    @TempData[“电子邮件”]
    @TempData[“城市”]
    @TempData[“MobNo”]
    
    只是TempData的旁注。
    在下一次请求之前,不会存储其中的数据,而是在调用下一次读取操作之前
    请参阅:

    在相同的情况下,ViewData的值会被保留吗?@Ismail:不会,ViewData不会通过重定向来保留数据。这是TempData的主要区别。我认为这是一个相当大的区别,因为
    TempData
    将涉及比从方法传递到方法的简单字典更复杂的潜在内容(会话)。我想在这里添加一些关于
    TempData
    的内容
    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();
        }
    
    <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>