ASP.NET MVC - About ViewData, ViewBag, TempData

在 ASP.NET MVC 2 時,我們要由 Controller 傳遞資料給 View,可以使用 ViewData、TempData。
在 ASP.NET MVC 3 時,除了原先的 ViewData、TempData,還新增一個 ViewBag。

我們今天簡單討論一下這三者。

  • 傳遞小量資料:使用 ViewData、ViewBag 都一樣。
  • 傳遞大量或複雜資料:使用 ViewModel。
  • 由現在 to 下一個 Http Request:使用 TempData ( Http 302 status )

ViewData 物件

它是一個 Dictionary Object ( ViewDataDictionary Class ),你能放任何資料進去,使用「Key / Value」語法存取。

ViewBag 物件

它和 ViewData 物件一樣,也能放任何資料進去,但更棒的事,ViewBag 能產生「動態屬性」

例如,

Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult
        ViewData("Message1") = "歡迎使用 ASP.NET MVC!"
        ViewBag.Message2 = "歡迎使用 ASP.NET MVC 3!"

        Return View()
    End Function

    Function About() As ActionResult
        Return View()
    End Function
End Class

我們看 Index.aspx ( View )

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%: ViewData("Message1") %></h2>
    <h2><%: ViewBag.Message2 %></h2>
</asp:Content>

如果我們在 Controller / Index 裡把 ViewData 的 Key 設為 Message,然後把 ViewBag 的動態屬性也設為 Message,你會發現後面的 Message 的值會覆蓋前面的,以上例來說,將 View 全部改為 Message,將會全部顯示「"歡迎使用 ASP.NET MVC 3!"」

我最常使用在傳遞 Dropdown lists 的值給 View。

TempData 物件


TempData 很清楚的,是拿來存放「暫時性」資料,但它有一特性,使用 Redirect 相關 ActionResult 之後,ViewData 或 ViewBag 的資料都會不見。通常是在,Action --> Action 有需要傳遞資料時,就會使用 TempData。我們修改範例,


Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult
        ' Message1 是 Key,  "歡迎使用 ASP.NET MVC!" 是 Value
        ViewData("Message1") = "歡迎使用 ASP.NET MVC!"
        ' Message2 是動態屬性
        ViewBag.Message2 = "歡迎使用 ASP.NET MVC ViewBag!"
        ' TempData 也是 Key / Value 存取
        TempData("Message3") = "歡迎使用 ASP.NET MVC TempData"
        
        '測試 ViewData, ViewBag, TempData 三者經過 Redirect 後的結果
        Return RedirectToAction("About")
    End Function

    Function About() As ActionResult
        Return View()
    End Function
End Class

修改 About.aspx

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="aboutTitle" ContentPlaceHolderID="TitleContent" runat="server">
    About
</asp:Content>
<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>About</h2>
    <div>
        <h2>Message1 : <%: ViewData("Message1") %></h2>
        <h2>Message2 : <%: ViewBag.Message2 %></h2>
        <h2>Message3 : <%: TempData("Message3") %></h2>
    </div>
</asp:Content>

讓畫面說話吧!


而且 TempData 只要經過取得,資料就會消失,也就是「存也一次,取也一次」,這就是 TempData 的生命週期。

參考:

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。