[ASP.NET][MVC] ASP.NET MVC (11) : View 中幾個有趣的比較

在寫 ASP.NET MVC 應用程式時,在 View 中有幾樣東西特別有趣,在此做一個比較。

在寫 ASP.NET MVC 應用程式時,在 View 中有幾樣東西特別有趣,在此做一個比較。

1. ViewData vs. TempData

ViewData 和 TempData 是在 MVC 中暫存資料的一種物件,和 Web Form 的 ViewState 很像,最常被用到的是 ViewData,而有些教學中會特別說明 ViewData 和 TempData 功能相同,只是微軟有這麼閒,在 MVC 中提供兩種相同功能的物件?所以我們特別翻了一下 ASP.NET MVC 的 source code (System.Web.Mvc.dll),找到 ViewData 和 TempData 的來源,分別是 ViewDataDictionary 與 TempDataDictionary,不過 ViewDataDictionary 就只是單純的鍵值對物件,但 TempDataDictionary 會由一個 ITempDataProvider 介面的物件載入,而去追蹤 MVC 中有實作 ITempDataProvider 的物件,追到了一個 SessionStateTempDataProvider,內部的實作是用 Session 去保存 TempData 內的資料。

所以,ViewData 是單向丟給 View 的資料,而 TempData 則是可雙向交換的資料,將 TempData 視為 Session,就可以更明白它的用處了。

 

2. Url, Html 和 Ajax

在 MVC 的 View 中,有三種不同的輸出資料工具,分別是 UrlHelper, HtmlHelper 與 AjaxHelper,在 Razor 語法中分別為 @Url, @Html 與 @Ajax,雖然它們都是 Helper,但用途卻大不相同:

  • UrlHelper 輸出的是 URL,但不包含 <a> 或驅動它的元素,它就只是輸出字串而已。
  • HtmlHelper 輸出的是 HTML 指令。
  • AjaxHelper 輸出的是可用於 AJAX 作業的指令,但實際的實作會放在指令碼內。

UrlHelper 的實際輸出是來自 UrlHelper.GenerateUrl;HtmlHelper 的輸出是來自不同的實作,像是 InputHelper(), SelectInternal() 等等;AjaxHelper 的輸出是來自 System.Web.Mvc.Ajax.AjaxExtensions 中的方法。

其他如果發現有一不同的地方,再回頭來充實本文。