關於函數參數的傳遞方式:
值傳遞:只是將參數值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這個接口就行,但一般情況沒有必要這么做。