控制器向視圖傳遞數據的方法


 關於函數參數的傳遞方式:

 值傳遞:只是將參數值copy函數中,因此在函數中無法修改該參數的值。修改的只是傳入參數的一份copy.

 引用傳遞:將參數地址傳給函數,因此在函數中能修改該參數的值

http://blog.csdn.net/sknice/article/details/42323791

http://www.cnblogs.com/wenjiang/archive/2013/06/07/3123100.html

使用Model對象

介紹Razor語法,讓我們從Index.cshtml文件的第一行開始:

@model MvcApplication1.Models.Product

Razor語句都是以@符號開始的。每個視圖都有自己的Model屬性(通過@Model調用)。上面這句代碼的意思是將本視圖的Model屬性的類型指向MvcApplication1.Models.Product類型,這就實現了強類型。強類型的好處之一是類型安全,如果寫錯了Model對象的某個成員名,編譯器會報錯;另一個好處是在VS中可以使用VS中的代碼智能提示自動完成類型成員調用的代碼編寫。 當然這句代碼不要程序也可以正常運行,只是給編寫代碼造成了一定的困難。

視圖中的Model屬性用於存放控制器(Controller)傳遞過來的model實例對象(本示例中ProductController通過“return View(myProduct)”傳遞給Index視圖),下面的代碼演示了如何調用該model對象:

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Index";
}
<!-- 調用Product實例的Name屬性 -->
<h2>名稱:@Model.Name</h2>

注意,第一行代碼用於聲名Model屬性類型用的是@model <Model類型名>(小寫m),而調用控制器傳遞過來的Model對象用的是@Model.<屬性名>(大寫M)。

 

 

1. 使用 ViewData 傳遞數據

Controller:ViewData["Name"]="代碼里";

View:@(ViewData["Name"])

注:只在當前頁面訪問,無法跨頁傳遞;

 

2. 使用TempData傳遞數據

Controller:TempData["Name"]="代碼里";

View:@(TempData["Name"])

注:保存在Session中,可以實現跨頁傳遞,且傳遞一次之后自動刪除(只能使用一次)

 

3. 使用Model傳遞數據

Controller:Person person=new Person(){Name="代碼里"};

return View(person);

View:@model Person

@(Model.Name)

通過強類型視圖直接傳遞實例化對象

上一次只講了上面3種方式,第四種是Co君常用的一種傳值方式:ViewBag,經常用給不小心漏掉了,非常抱歉

 

4. 使用ViewBag傳遞數據

ViewBag是dynamic類型對象,所以使用時不需要進行類型的轉換,性能上比ViewData要稍微差一點點,但是應該大多數人都喜歡用ViewBag,不論從書寫還是可讀性來說,ViewBag都略勝一籌

    

在"Home" 控制器的Index()動作方法中,設置ViewBag屬性值。

namespace MvcApplication1:Controllers{     public class HomeController:Controller    {        public ActionResult  Index()        {            ViewBag.Name="代碼里";            ViewBag.Ads="www.daimali.com";            ViewBag.person=new Person{name="李四",sex="男"};            return View();        }    }}

示例中我們可以直接通過 【ViewBag.自定義屬性】,用法非常方便。

<html><head></head><body>    站點名稱:@(ViewBag.Name)    網站地址:@(ViewBag.Ads)     所屬人:@(ViewBag.person.name)     性別:  @(ViewBag.person.sex)</body></html>

使用時不需要進行類型的轉換即可直接調用。同時它和ViewData一樣,都只在當前頁面訪問,無法實現跨頁傳遞。

 

TempData也是字典,所以它的使用完全等同於ViewData,但兩者之間還是存在很大的差異。

     TempData,顧名思義,就是臨時數據。TempData保存在Session中,Controller每次請求的時候都會從Session中獲取TempData,然后清除Session。基於這樣的事實,在每次請求結束后,TempData的生命周期也就結束了。網上有一句話:TempData至多之只能通過一次Controller傳遞,假設我們的Controller是跳轉到下一個Controller,以此類推,在最后一個Controlle相應的視圖上,的確可以獲得該TempData。但是,這並不是說TempData已經跨請求傳遞了,這依然只是一次請求,至於是否是跨Controller傳遞,我認為不是,所謂的通過Controller傳遞,是指將TempData傳遞給View,在上面的例子中,只有最后的Controller才會將該TempData傳遞給View,所以,TempData的確是只能通過一次Controller傳遞。

      TempData也可以在Action之間傳遞的,像是這樣:

復制代碼
public ActionResult Index()
{
    TempData["message"] = "Hello";
    return View();
}

public ActionResult About()
{
    if ("Hello" == TempData["message"] as string)
    {
         TempData["message"] = "Hello,Word";
    }
    return View();
}
復制代碼

      但必須注意,要使該行為正確,也就是TempData能夠被傳遞給另一個Action,Index操作對應的視圖就不能使用TempData,因為一旦使用就相當於一次請求,那么TempData中的值就會被清空。

      TempData是存儲在Session中,但這個並不是絕對的,我們可以改變TempData的存儲地方,只要實現ITempDataProvider這個接口就行,但一般情況沒有必要這么做。 


免責聲明!

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



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