在 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 的生命週期。
參考:
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。