代码之家  ›  专栏  ›  技术社区  ›  Elijah Manor

viewdata和tempdata之间的区别?

  •  91
  • Elijah Manor  · 技术社区  · 17 年前

    我知道什么是viewdata并一直使用它,但是在ASP.NET预览5中,他们引入了一种新的叫做tempdata的东西。

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

    那么,什么时候应该使用tempdata而不是viewdata?

    这方面有什么最佳实践吗?

    6 回复  |  直到 7 年前
        1
  •  91
  •   Donal Dragan Panjkov    10 年前

    一句话: TempData 与VIEWDATA有一个区别:它们只包含两个连续请求之间的数据,之后就被销毁。你可以使用 临时数据 传递错误信息或类似的东西。

    虽然过时了, this article 有很好的描述 临时数据 生命周期。

    正如本·谢尔曼所说 here :

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

        2
  •  28
  •   Captain Sensible    17 年前

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

        3
  •  5
  •   AlexMelw    8 年前

    ViewData:

    • ViewData 是字典类型 public ViewDataDictionary ViewData { get; set; }
    • 它只能单向用于将数据从控制器传递到视图
    • 它的生命仅在当前请求期间存在
    • 如果传递字符串,则无需进行类型转换
    • 如果传递对象,则需要对其进行类型转换,但在此之前,需要检查它是否不为空。
    • 它的财产 ControllerBase ,它是 Controller

    TempData:

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

    此行为是ASP.NET MVC 2和更高版本中的新行为。 在早期版本的ASP.NET MVC中, 临时数据 只有在下一个请求之前才可用。

    1. 它是活动的,直到它被读取或会话过期,并且可以从任何地方读取。

    See the comparison of ViewData, ViewBag, TempData and Session in MVC in detail

        4
  •  4
  •   testpattern    10 年前

    我发现这个比较很有用: 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 .

        5
  •  0
  •   Hitanshi Mehta    7 年前

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

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

    TYY1.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();
        }
    

    TopVIEW1.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>
    
        6
  •  0
  •   nvirth    7 年前

    只是临时数据的旁注。
    其中的数据在 下一个请求 ,但直到 下一次读取操作 叫!
    见:
    TempData won't destroy after second request