初識MVC-controller隨筆 之前用的一些其他框架,也沒有系統性的學習MVC框架。最近才開始接觸,給大家簡單的分享一下經驗。 1 MVC的核心就是Controller(控制器),它負責處理瀏覽器傳送過來的所有請求,並決定要將什麼內容響應給瀏覽器。但Controller並不負責決定內容應該如何 ...
初識MVC-controller隨筆
之前用的一些其他框架,也沒有系統性的學習MVC框架。最近才開始接觸,給大家簡單的分享一下經驗。
1 MVC的核心就是Controller(控制器),它負責處理瀏覽器傳送過來的所有請求,並決定要將什麼內容響應給瀏覽器。但Controller並不負責決定內容應該如何顯示,而是將特定形態的內容響應給MVC架構,最後才由MVC架構依據響應的形態來決定如何將內容響應給瀏覽器。如何決定響應內容是View的責任。
2 Controller本身就是一個類(Class),該類有許多方法(Method)。在這些方法中,只要是公開方法,該方法就會被視為是一種動作(Action);只要有動作存在,就可以通過該動作方法接收網頁請求並決定響應視圖。
3 使用controller時應滿足的條件
- Controller必須為公開類
- Controller的名稱必須以"Controller"結尾
- 必須繼承自MVC內置的Controller類,或繼承自實現IController介面的自定義類,或自行實現IController介面。
- 所有方法必須為公開方法。該方法可以沒有參數,也可以有多個參數。
4 controller的執行過程
Controller被MvcHandler選中之後,下一步就是通過ActionInvoker選取適當的Action來執行。在Controller中,每一個Action可以定義0到多個參數。ActionInvoke會依據當前的RouteValue及客戶端傳過來的信息準備好可輸入Action參數的依據,最後正式調用被Controller選中的那個Action方法。Action執行完後的返回值通常是ActionResult類的。事實上,ActionResult類是一個抽象類,因此,MVC本身就實現了許多不同ActionResult類的子類。Controller得到ActionResult類之後,就會開始執行ActionResult類的ExecuteResult()方法,並將執行的結果返回客戶端。這時,Controller的任務就算完成了。
5 action動作名稱選取器
通過ActionInvoker選取Controller中的公開方法時預設會執行Index()方法。
如果Action中加入ActionName屬性,並將其指名為"Default",此時,若RouteValue表達式中的Action是"Index",就不會執行Index()方法,而必須使RouteValue表達式中的Action為"Default",Index()方法才能被正確執行,這就是動作名稱選取器(Action Name Selector)的作用,示例如下。
1 public class HomeController : Controller 2 { 3 /// <summary> 4 /// 要求網址 http://localhost/Home/Index 5 /// </summary> 6 [ActionName("Default")] 7 public ActionResult Index() 8 { 9 return View(); 10 } 11 12 }
唯一需要特別註意的是,如果你使用預設的"return View()"方法返回ActionResult類,由於應用了[ActionName("Default")]屬性,所以MVC會去尋找"/Views/Home/Default.aspx"頁面而不是"/Views/Home/Index.aspx"頁面來執行。
6 動作方法選取器
6.1 NonAction屬性
若將NonAction屬性應用在Controller中的Action方法上,即便該Action方法是公開方法,也會告知ActionInvoke不要選取這個Action來執行。這個屬性主要用來保護Controller中的特定公開方法不會被髮布到Web上。或是當功能尚未開發完成就要進行部署時,若暫時不想將此方法刪除,也可應用這個屬性,表示"不要對外公開"。
[NonAction] public ActionResult Index() { return View(); }
將Action方法中的"public"修改成"privare",也可以達到同樣的目的
6.2 HttpGet屬性、HttpPost屬性、HttpDelete屬性和HttpPut屬性
HttpGet、HttpPost、HttpDelete和HttpPut屬性是動作方法選取器的一部分,我們以下列程式為例進行介紹。若應用了[httpPost]屬性,表示只有當客戶端瀏覽器發送HTTP POST請求時才可以選取這個Action。
[HttpPost] 2 private ActionResult Index() 3 { 4 return View(); 5 }
相反的,若果沒有應用這些屬性,客戶端瀏覽器發送任何HTTP動詞,都會自動選取對應的Action。
這些屬性常用在需要接受視窗數據的時候。你可以創建兩個同名的Action,一個應用[HttpGet]屬性來顯示視窗HTML,另一個應用[HttpPost]屬性來接收視窗送出的值,
7 ActionResult類
ActionResult類是Action執行的結果,但ActionResult中並不包含執行結果,而是包含執行響應時所需的信息。當Action返回ActionResult類之後,會由MVC執行。先看看ActionResult抽象類的程式代碼。在ActionResult抽象類中僅定義了一個ExecuteResult()方法來執行結果
MVC定義的ActionResult如表所示:
表中的Controller輔助方法在Controller類中為返回ActionResult類提供支持,如下程式可用於跳轉到另一個頁面。
1 [HttpPost] 2 public ActionResult Post(FormCollection c) 3 { 4 return new RedirectResult("/"); 5 }
到此本文結束,如果還有什麼疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。