一步步學習ASP.NET MVC3 (5)——View從Action中獲得數據


 請注明轉載地址:http://www.cnblogs.com/arhat

在上一章中,我們把Razor的模板技術給大家介紹了一下,當然模板中還有其他的知識點,這個以后我們還會繼續講解。本章我們主要討論一下View如何從Action中取得數據。可以說本章所講的知識起到了一個承上啟下的作用,因為Action負責傳遞數據,View負責顯示數據,那么問題就是Action如何把數據傳遞給View了呢?這就是本章的主要內容。

Action把數據傳遞給View主要有兩種方式,一種是“使用弱類型”,一種是“使用強類型”,其實兩者的主要差別就是看在View中的聲明方式。老魏認為使用“強類型”比較好,一是可以使用VS提供的智能提示加快開發效率,二是強類型不容易犯錯。那么下面我們看看是如何實現的。那么View從Action接受數據的方式可以從ViewData,ViewBag或TempData取得(關於這三個屬性,我們在后面的章節中將重點講解,本章只要學會用就可以了)。

首先,我們可以使用上一章的項目,也可以新建一個項目。這里我使用了上一章的項目。那么,我們先在Models文件夾中創建一個類”M_Person”。內容如下:

public class M_Person

    {

public string Name { get; set; }

public int Age { get; set; }

}

改寫HomeControlller的Index方法:

public ActionResult Index()

        {

            Models.M_Person person = new Models.M_Person() { Name = "濟公活佛", Age = 90 };

            ViewData.Model = person;

return View();

        }

這里我們使用了ViewData來傳遞數據,把數據放到了ViewData.Model屬性中。ViewData.Model是object類型。此時,打開我們的Index.cshtml頁面,把數據取出並顯示出來。代碼如下:

<div>

    這是從ViewData.Model中取出的數據 @ViewData.Model.Name

</div>

我們從瀏覽器中看到的結果是正確的。但是我們在書寫@ViewData.Model.Name的時候,VS沒有給我們Name的提示。但是卻沒有出錯,原因是在ASP.NET MVC 中使用了”動態表達式”。那么這樣的話,在書寫屬性的時候很容易出錯。大家可以看出,我們在Index.cshtml中並沒有聲明任何的說明,那么這樣的方式就是弱類型。
如果要使用強類型,那么需要在Index.cshtml中聲明Model的類型。怎么聲明呢?我們通過Razor提供額@model指令來指示,注意這里的@model是小寫,千萬不能寫成@Model。好,我們來改一下代碼:

@model Com.ArHat.Web.Models.M_Person

<div>

    這是從ViewData.Model中取出的數據 @ViewData.Model.Name

</div>

那么我們在寫屬性的時候VS給了我們提示,非常的方便。

wps_clip_image-16542

從上面的例子可以看出,無論使用“弱類型”還是“強類型”都可以正確的拿到數據,當然這里老魏推薦使用“強類型”。注意了,@model指令一般和ViewData.Mode一起使用。

剛才給大家演示了使用ViewData.Model來傳遞數據,當然還可以使用ViewData的索引來傳遞數據。我們把Index方法更改一下:

public ActionResult Index()

{

            Models.M_Person person = new Models.M_Person() { Name = "濟公活佛", Age = 90 };

//ViewBag.Data = person;

            ViewData["data"] = person;            

return View();

}

通過ViewData的索引可以自定義鍵名和值。當我們把數據放到了ViewData[“data”]中了,在Index.cshtml頁面如何把數據拿出來呢?

@using  Com.ArHat.Web.Models;

@{var p = ViewData["data"] as M_Person;}

<div>

這是從ViewData["data"]中取出的數據 @p.Name

</div>

大家會發現,寫法和先前的寫法有所不同了,@model屬性只能針對ViewData.Model屬性,而這里使用索引的話,那么任何值都是作為object來傳遞的。所以,我們要在頁面中使用@using來導入類型的命名空間,同時還要把數據強制的轉換為對應的類型,才能把數據取出來。

下面我介紹一下ViewBag屬性來傳遞屬性,老魏比較喜歡這個傳值方式,完全是動態的化的,其實主要依賴於.net 4.0 中 dynamic的功能,好了,我們來看一下,還是改寫一下Index方法。

public ActionResult Index()

        {

            Models.M_Person person = new Models.M_Person() { Name = "濟公活佛", Age = 90 };

//ViewBag.Data = person;

//ViewData["data"] = person;  

            ViewBag.Data = person;

return View();

        }

ViewBag本身沒有Data屬性,這個屬性是我們自己加上去的,其實就等於ViewData[“data”]。那么同樣改寫一下Index.cshtml

<div>

 這是從ViewBag.Data中取出的數據 @ViewBag.Data.Name

</div>

同樣是在頁面沒有使用@model,@using但是我們卻取出了數據,這也是“弱類型”的取值方式。當然如果我們也可以使用強類型,只要在Index.cshtml中聲明@using  Com.ArHat.Web.Models。

@using  Com.ArHat.Web.Models;

@{var p = ViewBag.Data as M_Person;}

<div>

這是從ViewBag.Data中取出的數據 @p.Name

</div>

到此,我們介紹了Action如何把數據傳遞給View,而View又如何獲取數據的。至於TempData我們將在后面的章節中來講解。
下面的內容是聯系內容,主要是來練習一下Razor對數據的處理。
我們改寫一下Index方法,創建一個List<Models.M_Person>集合,然后我們在Index.cshtml中展示出這個集合中的元素。

public ActionResult Index()

        {

List<Models.M_Person> list = new List<Models.M_Person>() { 

new Models.M_Person() { Name = "濟公活佛", Age = 90 },

new Models.M_Person() { Name = "廣亮和尚", Age = 88 },

new Models.M_Person() { Name = "慪氣禪師", Age = 45 },

new Models.M_Person() { Name = "飛龍僧", Age = 123 }

                                        };

//ViewBag.Data = person;

//ViewData["data"] = person;  

            ViewBag.Data = list;

return View();

        }

同時更改一下Index.cshtml文件。

@using  Com.ArHat.Web.Models;

@foreach (M_Person person in ViewBag.Data) { 

<div style="margin-top:10px">和尚:@(person.Name),年齡:@(person.Age)</div>

}

預覽一下效果。
wps_clip_image-19150

非常簡單吧,學習ASP.NET MVC是一件非常簡單快樂事。呵呵,下一節,我們繼續關注Razor的高級應用!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM