ASP.NET MVC — Controller

謝駿辰
Jason的網頁筆記
Oct 25, 2021
Photo by Nadine Shaabana on Unsplash

網站已搬家,請到新網站支持我呦> https://jasonhsieh-web.github.io/

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設定的規則,參數分別為:

  1. Name:對於這個Route的命名
  2. Url:網址條件,當網址符合條件時,會依據這個Route去找對應的程式碼
  3. Defaults:參數的預設值。第一層為Controller、第二層為Action、第三層為Id。若網址未輸入Controller.Action.Id,預設路由/Home/Index,

注意:id不像controller跟action都指派到一個很明確的目標預設可有可無因此設值為UrlParameter.Optional(若不是設定UrlParameter.Optional則會變成必帶參數)。詳細路由會在寫一篇來介紹~

ActionResult

ActionResult是用來回傳執行結果的抽象類別,以下列出ActionResult及ActionResult的衍生類別

  1. ContentResult

會回傳純文字文件

2.EmptyResult

會回傳空的結果,通常只要Action的回傳是null,Asp.Net MVC將會使用EmptyResult當作回傳類型。

3.RedirectResult

此回傳會重新導向連結,此方法相當於Asp.Net的Response.Redirect。

當在網址輸入/Home/RedirectResult會被導向到/Home/Index。

4.RedirectToRouteResult

此回傳與RedirectResult類似會重新導向連結,不同的是RedirectToRouteResult是使用Controller類別的RedirecToAction和RedirecToRoute方法來回傳。

注意:RedirectResult是根據網址(Url)進行頁面導向,只需Url撰寫正確,不僅是同一專案下的Controller Action,連同"外部"的網頁都可以進行導向。RedirectToRouteResult是根據路由(Route)來進行導向,主要只會導向至同一專案下的Controller Action。

5.ViewResult

會回傳一個檢視(View)結果

6.PatialViewResult

與ViewResult類似,都會回傳一個檢視結果,不同的是回傳一個部分檢視(Partial View),而且也不支援主版的應用,詳細用法會在另外寫一篇介紹。

7.HttpUnauthorizedResult

會回傳一個未經授權的錯誤,Asp.Net MVC會發送一個HTTP錯誤401的狀態

8.HttpNotFoundResult

會回傳一個HTTP錯誤404找不到資源的狀態

9.JsonResult

會傳一個Json結果,Asp.Net MVC將Response.ContentType定義為application/json,並透過JavaScriptSerializer將回傳物件序列化成Json字串,Asp.Net MVC會默認不允許GET請求JSON結果,若要使用必須將JsonRequestBehavior設置為AllowGet。

10.FilePathResult

會回傳一個檔案內容,而FilePathResult是透過路徑來傳送檔案到客戶端,主要是以Controller類別的File方法來回傳FilePathResult。

11.FileContentResult

會回傳一個檔案內容,而FileContentResult是透過二進位資料的方式傳遞。

12.FileStreamResult

會回傳一個檔案內容,是透過Stream的方式傳遞。

13.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# )

如果我的筆記對您有幫助的話,不吝嗇給我個clap哦~ 謝謝您 !

--

--