Controller的責任
MVC強調關注點分離,其中Controller只負責網站流程相關,其他像是商業邏輯或頁面顯示等工作,Controller一律不會介入,主要著重在控制網站及使用路由傳遞資料等認識。
Controller的基本要求
Controller為一個類別,此類別可以包含許多方法(Method),這方法會被稱為一個Action或Action方法,透過這些Action,Controller可接受客戶端傳送來的要求與決定回應的View。
新增Controller時必須注意類別名稱必須是Controller結尾
Controller接受請求後會依照程式敘述判斷是否需要對Model或Service進行呼叫,若Controller需對其進行呼叫,程式便會執行Model中的商業邏輯或是使用Service進行資料庫處理,然後回傳所需的資料至Controller。
RouteConfig
要如何知道網址和Controller的相對應關係呢?我們可以找到/APP_Start/RouteConfig.cs這支檔案。
IgnoreRoute
在此語法後的字串,代表的是不要透過Routing處理的網址
MapRoute
MapRoute表示Routing設定的規則,參數分別為:
- Name:對於這個Route的命名
- Url:網址條件,當網址符合條件時,會依據這個Route去找對應的程式碼
- Defaults:參數的預設值。第一層為Controller、第二層為Action、第三層為Id。若網址未輸入Controller.Action.Id,預設路由/Home/Index
注意:id不像controller跟action都指派到一個很明確的目標預設可有可無因此設值為UrlParameter.Optional(若不是設定UrlParameter.Optional則會變成必帶參數)。詳細路由會在寫一篇來介紹~
ActionResult
ActionResult是用來回傳執行結果的抽象類別,以下列出ActionResult及ActionResult的衍生類別
- ContentResult
會回傳純文字文件
- EmptyResult
會回傳空的結果,通常只要Action的回傳是null,Asp.Net MVC將會使用EmptyResult當作回傳類型。
- RedirectResult
此回傳會重新導向連結,此方法相當於Asp.Net的Response.Redirect。
當在網址輸入/Home/RedirectResult會被導向到/Home/Index。
- RedirectToRouteResult
此回傳與RedirectResult類似會重新導向連結,不同的是RedirectToRouteResult是使用Controller類別的RedirecToAction和RedirecToRoute方法來回傳。
注意:RedirectResult是根據網址(Url)進行頁面導向,只需Url撰寫正確,不僅是同一專案下的Controller Action,連同”外部”的網頁都可以進行導向。RedirectToRouteResult是根據路由(Route)來進行導向,主要只會導向至同一專案下的Controller Action。
- ViewResult
會回傳一個檢視(View)結果
- PatialViewResult
與ViewResult類似,都會回傳一個檢視結果,不同的是回傳一個部分檢視(Partial View),而且也不支援主版的應用,詳細用法會在另外寫一篇介紹。
- HttpUnauthorizedResult
會回傳一個未經授權的錯誤,Asp.Net MVC會發送一個HTTP錯誤401的狀態
- HttpNotFoundResult
與ViewResult類似,都會回傳一個檢視結果,不同的是回傳一個部分檢視(Partial View),而且也不支援主版的應用,詳細用法會在另外寫一篇介紹。
- JsonResult
會傳一個Json結果,Asp.Net MVC將Response.ContentType定義為application/json,並透過JavaScriptSerializer將回傳物件序列化成Json字串,Asp.Net MVC會默認不允許GET請求JSON結果,若要使用必須將JsonRequestBehavior設置為AllowGet。
- FilePathResult
會回傳一個檔案內容,而FilePathResult是透過路徑來傳送檔案到客戶端,主要是以Controller類別的File方法來回傳FilePathResult。
- FileContentResult
會回傳一個檔案內容,而FileContentResult是透過二進位資料的方式傳遞。
- FileStreamResult
會回傳一個檔案內容,是透過Stream的方式傳遞。
- ActionResult
ActionResult是Controller Action執行後的回傳結果類型,上述所講的類別都是直接或間接繼承自ActionResult,所以在基本上上述幾點所用的方法都可以用在ActionResult上。ActionResult的回傳可使用直接或間接繼承至ActionResult的類別,所以ActionResult的回傳結果比較廣泛。
ViewData、ViewBag、TempData
ViewData
利用ViewData可設定顯示在前端的資訊,在頁面中只要透過ViewData就可取得後端傳來的資料,ViewData只能對一個Action有作用,若頁面導向後ViewData中的資料便會清除。
ViewBag
ViewBag與ViewData有一樣的功用,差別在於ViewBag可產生動態屬性,利用dynamic這個型別包裝,使用ViewBag時不需再進行類別的轉換,資料可直接取用。
TempData
TempData預設會將資料存放在Session,因此生命週期存在於一整個Request的範圍,就算網頁進行導向,還是能夠取得資料,但只允許一次的導向,在經過第二次後TempData的資料會清楚,而TempData可在Controller與Controller之間做傳遞。
參考至: 一次就懂 ASP.NET MVC 5.x 網站開發:Web應用的經典實務範例解析(Visual C#)
文章若有錯誤或想交流,還不吝嗇給予指教哦