1.7 再探模型資料-強型別檢視

ASP.NET MVC 實務精要|第一章 快速入門

ViewBag或是ViewData適合處理片段的小量資料,如果是比較複雜需要組織的資料,就必須透過模型進行處理。稍早我們曾經示範了資料模型,並且於控制器中將資料物件傳入檢視,由於Razor語法中的@model關鍵字預先定義了模型資料的型別如下:

@model IEnumerable<FirstMVC.Models.Item>

因此我們可以直接經由Model 取得資料內容。IEnumerable 是一種資料集合,所以利用 foreach 將資料逐一取出

@foreach (var item in Model)

迴圈中的每一筆item 是一個 FirstMVC.Models.Item 型別物件,接下來只要引用對應的欄位名稱即可將資料取出。

如你所見,由於所取出的資料預先以@model指定了型別,因此可以對其直接進行存取,此種預先指定型別的檢視稱為強型別檢視,事實上Model回傳的是一個通用的模型物件,它以動態型別的型式存在以支持任意型別的資料存取,在預設的情形下,當你利用 Model 取得的資料物件進行資料存取時並不會對應至特定型別,若是沒有建立強型別檢視,就必須將其鑄型成為@model所指定的型別。

現在回到Products.cshtml這個檔案,嘗試註解其中的 @model 這一行

@*@model IEnumerable<FirstMVC.Models.Item>*@

重新瀏覽網頁會得到以下的結果畫面:



由於這一次並沒有指定明確的型別,因此無法存取 Model 的內容,現在調整foreach語法如下:

@foreach (var item in (IEnumerable<FirstMVC.Models.Item>)ViewData.Model)

這裏引用ViewData.Model 取代原來的 Model 關鍵字取得資料物件,再將其鑄型成IEnumerable 以進行其中的資料存取。

ViewData.Model 是 ViewData 內建屬性,用來表示每一個網頁要求回傳的資料物件,這與稍早討論 ViewBag資料字典時動態建立的索引鍵值意義相同,你也可以透過以下的語法取得此物件:

ViewData["model"]

Model 是內建屬性,以資料物件為目標,被賦于專屬的功能,建議直接以 ViewData.Model 進行存取以避免與其他動態屬性混淆。


沒有留言: