Controller主要負責響應使用者的輸入。主要關注的是應用程式流,輸入資料的處理,以及對相關視圖(View)輸出資料的提供。
繼承自:System.Web.Mvc.Controller
一個Controller可以包含多個Action. 每一個Action都是一個方法, 傳回一個ActionResult執行個體
一個Controller對應一個xxController.cs控制檔案,對應在View中有一個xx檔案夾。一般情況一個Action對應一個View頁面
Action方法接收參數:
a.接收浏覽器傳過來的參數(get-兩種格式/post)
a1.接收FormCollection Request.Form
1.通過Request.Form["name"] 逐個擷取 表單送出的資料
在View視圖中
控制器中
注意:在View界面要存在name屬性為CusName的表單元素,因為送出表單資料的時候,隻會送出所有帶name标簽的資料。
2.通過 FormCollection form逐個擷取 表單送出的資料
a2.接收Model
通過 實體對象 一次性擷取 表單元素的資料,并設定到實體對象對應的屬性中


注意: 表單中的表單元素的屬性名稱必須和實體對象的屬性一樣!
折疊類中所有方法:ctrl+m+o
折疊類中所有的代碼塊,包括類:ctrl+m+l
b.接收Get資料,Request.QueryString
直接通過請求上下文對象裡的 Request擷取 url ?後的的參數:
浏覽器請求路徑為:/User/UserList/1?kjy=jp
控制器擷取:Request.QueryString["kjy"];
Action方法輸出傳回值:
b1.string:直接 傳回響應封包字元串;
b2.ActionResult:傳回控制器結果對象
(裡面會包含什麼呢?能做什麼呢?)
b3.JsonResult:傳回 Json 字元串
Action的傳回值-ActionResult


Controller是如何向View進行資料傳輸的呢?
控制器将處理後的資料“傳”給視圖的方式
ViewData/ViewBag/TempData/Model
我們先來看下示例
控制器代碼:


View代碼:


大家可能覺得這十分顯而易見,結果肯定是
小李飛刀
陸小鳳
楚留香
謝曉峰
可是,我要告訴你,結果并不是像你想象的那樣,而是會顯示為這樣:
為什麼呢?因為ViewData和ViewBag本質上都是【ViewDataDictionary】類型,并且兩者之間的資料共享,隻不過提供了不同的文法操作方式而已。
是以“陸小鳳”覆寫了原先的值”小李飛刀“。
TempData,看名稱我們就知道,隻用來臨時存儲的,存儲一次就失效了,不會再共享啊什麼的。
打開我一直吐血推薦的犀利工具Reflector,我們來看下源碼
我們看到HomeController : Controller,public abstract class Controller : ControllerBase
發現,隻要從TempData中取出一個元素,就會立即将此元素移除!
在控制器裡的Action方法最後 調用View加載視圖的時候,将 資料對象傳入。
視圖中,可以通過 Model屬性擷取!并且不需要轉型就可以直接使用!
注意:Model雖然可以不轉型就直接使用,但是 因為編譯器無法在編譯時擷取它的類型,是以就無法出現智能提示!為了解決這個問題,我們可以在試圖的最上面通過代碼指定model類型
如果沒有添加@model指令:目前視圖就會繼承于 WebViewPage<T> 強類型視圖頁面類,但T變成了 dynamic
到這裡,Controller的資料怎麼就傳到View了,我明明隻給Controller中的ViewData/ViewBag/TempData/指派了,或者隻把對象傳給了View方法。
為什麼View中就可以直接調用了呢?我們知道以前的ASP.NET,aspx和aspx.cs是一個繼承關系,子類可以直接調用父類的屬性方法。你ASP.NET MVC中View和Controller之間又有什麼關系呢?
View和Controller中都有ViewData/ViewBag/TempData這幾個對象,在給Controller中這些對象指派後,Controller會把這些值指派給View中對應的這幾個對象。
本文轉自鄒瓊俊部落格園部落格,原文連結:http://www.cnblogs.com/jiekzou/p/4780412.html,如需轉載請自行聯系原作者