掉進 ASP.NET MVC 馬里亞納海溝的第二天:URL 特性 + Controller 和 View 的關係
MVC 結構
MVC 的結構如下圖:

一開始瀏覽器在向網頁伺服器要求時,一定會先經過 Controller。因此可知:
沒有 Controller 只有 View 是無法產生畫面的。
一定要有 Controller 才能產生畫面。如:前一天的 Hello World,沒有 View 也沒關係。
MVC URL 特性
MVC 網址並不是依照資料夾名稱,而是由 Controller 前面的名稱和該控制器底下的 Action Method 名稱組合而成,以斜線分開。

由 MVC 網址特性,也可以感受到程式利用 Controller 和 Action 來操縱 View 的特性。
透過網址呼叫特定 Action,回傳特定資料,並且呈現在瀏覽器畫面上。
新增 Controller 和命名
在稍微了解 URL 的特性之後,接著我們來建立一個新的 Controller 和為它命名 (決定出現在網址的控制器名字):
- 滑鼠右鍵點擊方案總管中 Controllers 資料夾 >> Add >> Controller。
- 選擇 Empty 控制器。

- 為控制器命名,只更改 Default,保留後面的 Controller,變成 XxxController (第一個字建議大寫)。MVC 網址中就會以 Xxx 組合而成。

MVC Routing 方式
在 Global.asax 檔案中,可以看到 RegisterRoutes() 方法。對方法:點擊右鍵 >> Go To Definition。

會打開 App_Start 資料夾底下的 RouteConfig.cs 檔案,可以看到在 RegisterRoutes() 方法中,有一個 routes.MapRoute();。其中第 17 行 name: "Defualt", 表示下方定義的是預設的路由位置,並且網址可以不顯示。

因此,如果網址中沒有顯示 controller 和 action 的名字,表示預設導向至 Home 控制器底下的 Index 方法。

如果 Home 控制器底下沒有 Index 方法,上方會出現 404 錯誤。
如何接收網址中的 ID 和查詢字串?
定義 Action method 時,可以定義接收 ID 的 parameter,如下圖。如果網址中沒有 ID 和查詢字串,畫面即不顯示,不會出錯。

接收 ID
網址中有 ID 時,呈現在畫面:

接收查詢字串
網址中有 ID 和查詢字串時,以 Request.QueryString[查詢字串的key] 來接收查詢字串的 value,呈現在畫面:

或是以 Action method 的 parameter 來接收查詢字串的 value,如下:

Controller 和 View 的關係
Controllers 資料夾 中的控制器,會對應到 Views 資料夾 中的視圖資料夾,而且名稱會對應,如下圖:

因為,我們在新增一個 Controller 時,程式會依照你的命名,產生一個相同名字的視圖資料夾。
Controller 中 Action 和 View 的關係
前面提過,一定要有 Controller 才能產生畫面。其實是指 Controller 中要定義 Action method。
因此又可以說是:
沒有 Controller 中的 Action,只有 View 是無法產生畫面的。
一定要有 Controller 中的 Action 才能產生畫面。
瀏覽器在向網頁伺服器發出 Request 時,一定會先經過 Controller,再藉由 Controller 中的 Action method 來決定產生什麼樣的畫面。以下依照不同的回傳值簡介三種類型:和 Action 對應的同名視圖、產生指定的不同名視圖、輸出字串到畫面。
和 Action 對應的同名視圖
如果 Action 的回傳型態是 ActionResult 且回傳值是 View(),則 Views 底下和 Controller 同名的資料夾 中,會有相對應和 Action 同名的 .cshtml 檔案。

例:
如 MVC URL 特性提到的,藉由網址輸入 .../TestView 來調用 TestView() Action method。
回傳值 View(),表示有一個和 Action 同名的 TestView.cshtml 視圖檔案,會將畫面顯示在瀏覽器上,如下圖。

這種做法的 Action 需要產生相對應的同名視圖檔案,否則報錯。
如果是新增的 Action 就會沒有相對應的視圖檔案。
新增視圖檔案的步驟:右鍵點擊 Action method 名稱 >> Add View… >> 勾選和範本選擇如下圖 (初學者版本) >> OK

產生指定的不同名視圖
藉由網址輸入 .../TestView1 或 .../TestView2 來調用 TestView1() 或 TestView2() Action method。
回傳值 View("TestView") 和 View("~/Views/Home/TestView.cshtml"),兩種寫法都可以用來表示將和 Action不同名的特定視圖,顯示在瀏覽器畫面上。
指定「檔名」

指定「完整路徑和檔名」

1 | // 產生不同名視圖 |
這種做法的 Action 不需要產生相對應的同名視圖檔案。
輸出字串到畫面
一樣藉由網址 .../TestString1 或 .../TestString2 來調用 TestString1() 或 TestString2() Action method。
有兩種回傳值的寫法,都可以產生在畫面上,如下:
回傳型態是 string

回傳型態是 ActionResult

1 | // 輸出字串 |
這種做法的 Action 不需要產生相對應的同名視圖檔案。