原文:Adding a controller
翻譯:婁宇(Lyrics)
校對:劉怡(AlexLEWIS)、何鎮汐、夏申斌、孟帥洋(書緣)
Model-View-Controller (MVC) 架構模式將一個應用程序分離成三個主要的組件: Model、View 以及 Controller 。 MVC 模式幫助你創建可測試的應用程序,比傳統的單塊應用程序更加容易維護和更新。基於 MVC 的應用程序包含:
- Models:應用程序中用來表示數據的類,並使用驗證邏輯來執行該數據業務規則。通常,模型(Model)對象從數據庫查詢和存儲 Model 狀態。在本教程
Movie
模型(Model)從數據庫查詢電影數據用來顯示或更新。更新后的數據寫入 SQL Server 數據庫。 - Views:視圖是顯示用戶界面(UI)的組件。通常,UI 用於顯示模型(Model)數據。
- Controllers:一種類(Class),用於處理瀏覽器請求,查詢模型(Model)數據,以及將指定視圖模板作為響應返回給瀏覽器。在 MVC 應用程序中,視圖(View)僅僅顯示信息; 控制器(Controller)處理和響應用戶的輸入和交互。例如, 控制器(Controller)處理路由數據和查詢字符串值,然后將這些值傳遞給模型(Model),模型(Model)可以使用這些值去查詢數據庫。
MVC 模式幫助你創建一個分離不同方面的應用程序(輸入邏輯,業務邏輯,以及 UI 邏輯),同時這些元素之間是松耦合的。該模式指定在應用程序中的每一種邏輯應該位於何處。 UI 邏輯屬於視圖(View)。輸入邏輯屬於控制器(Controller)。業務邏輯屬於模型(Model)。當你構建一個應用程序時,這樣的分離幫助你管理應用程序的復雜性,因為它使你編寫一個方面的代碼時不會影響其他(方面)的代碼。比如,你可以編寫視圖(View)代碼而不需要依賴於業務邏輯代碼。
我們會在本系列教程中涵蓋所有這些概念,並告訴你如何使用它們構建一個簡單的電影應用程序。下面的圖片展示了 MVC 項目中的 Models 、 Views 以及 Controllers 文件夾。
- 在 解決方案資源管理器(Solution Explorer) 中,鼠標右鍵點擊 Controllers > 添加(Add) > 新建項...(New Item...)
在 添加新項(Add New Item) 對話框,輸入 HelloWorldController。
用下面的代碼替換 Controllers/HelloWorldController.cs 中的內容:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
}
控制器(Controller)的每個 public
方法都可作為 HTTP 端點。在上面的例子中,兩個方法都返回 string,注意它們的注釋:
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/ (手動高亮)
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/ (手動高亮)
public string Welcome()
{
return "This is the Welcome action method...";
}
}
第一條注釋指出這是一個通過在 URL 后添加 "/HelloWorld/" 調用的 HTTP GET 方法。第二條指出這是一個通過在 URL 后添加 "/HelloWorld/Welcome/" 調用的 HTTP GET 方法。之后的教程我們將使用基架引擎來生成 HTTP POST
方法。
使用非調試模式(Ctrl+F5)運行應用程序,並在瀏覽器地址欄路徑后添加 "HelloWorld" (在下面的圖片中,使用了 http://localhost:1234/HelloWorld ,但是你必須用你的應用程序端口替換 1234 )。 Index
方法返回一段字符串,系統將這段字符串轉換為 HTML 返回給瀏覽器。
MVC 調用的控制器(Controller)類 (以及它們的 Action 方法) 取決於傳入的 URL 。MVC 的默認 URL 路由邏輯 采用類似下面規則格式來決定代碼的調用:
/[Controller]/[ActionName]/[Parameters]
你可以在 Startup.cs 文件中設置路由規則。
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}"); //(手動高亮)
});
當你運行應用程序且不提供任何 URL 段時,它將默認訪問在上面模板中高亮行指定的 "Home" Controller 中的 "Index" Action 方法。
第一個 URL 段決定運行哪個控制器(Controller)。所以 localhost:xxxx/HelloWorld
映射到 HelloWorldController
類。URL 段的第二部分決定類里的 Action 方法。所以 localhost:xxxx/HelloWorld/Index
將運行 HelloWorldController
中的 Index
方法。請注意,我們只需要瀏覽 localhost:xxxx/HelloWorld
,默認會調用 Index
方法。這是因為在沒有指定方法名時, Index
是默認方法。URL 段的第三部分 ( id
) 是路由數據。我們之后將在本教程中了解路由數據。
瀏覽 http://localhost:xxxx/HelloWorld/Welcome
。 Welcome
方法運行並返回 "This is the Welcome action method..." 。對於這個 URL , 控制器(Controller)是 HelloWorld
, Action 方法是 Welcome
。我們還沒有使用 URL 中的 [Parameters]
部分。
讓我們稍微修改一下例子,使我們能夠通過 URL 傳遞一些參數信息到控制器(Controller)(例如, /HelloWorld/Welcome?name=Scott&numtimes=4
)。如下所示修改 Welcome
方法使其包含兩個參數。請注意,代碼利用 C# 的可選參數特性指明,在沒有傳遞參數的情況下, numTimes
參數默認為1。
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, id: {numTimes}");
}
警告
上面的代碼使用HtmlEncoder.Default.Encode
來保護應用程序免受惡意輸入(即 JavaScript)。同時也使用了內插字符串。
警告
在 Visual Studio 2015 中,當你在 IIS Express 以非調試模式 (Ctl+F5) 運行,你不需要在修改代碼后生成應用程序。只需要保存文件,刷新你的瀏覽器就可以看到改變。
運行你的應用程序並瀏覽:
http://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4
(用你的端口替換 xxxx。) 你可以在 URL 中對 name
和 numtimes
嘗試不同的值。 MVC 模型綁定 系統自動將地址欄里查詢字符串中有名字的參數映射到你方法中的參數。查看 模型綁定 獲得更多的信息。
在上面的示例中, URL 段 (Parameters
) 沒有被使用, name
和 numTimes
參數作為 查詢字符串 被傳遞。 上面 URL 中的 ?
(問號) 是一個分隔符,后面跟查詢字符串。 &
字符分割查詢字符串。
用下面的代碼替換 Welcome
方法:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode(
"Hello " + name + ", ID: " + ID);
}
運行應用程序然后輸入 URL : http://localhost:xxx/HelloWorld/Welcome/3?name=Rick
這次第三個 URL 段匹配上路由參數 id
。 Welcome
方法包含一個與 MapRoute
內的 URL 模板相匹配的 id
參數。跟隨的 ?
(id?
) 表示 id
參數是可選的。
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}"); //(手動高亮)
});
在這些例子中,控制器(Controller)一直在做 MVC 中的 "VC" 部分,就是視圖(View)和控制器(Controller)部分的工作。這個控制器(Controller)直接返回 HTML 。一般來說你不想讓控制器(Controller) 直接返回 HTML ,因為這讓編碼和維護變得非常麻煩。所以,我們通常會使用一個單獨的 Razor 視圖模板文件來幫助生成 HTML 響應。 我們將在下一個教程中介紹這部分。
修訂歷史
- 2016/07/08,MS1;
- 2016/07/09,修訂至 1.0.0
- 修訂人:婁宇(Lyrics)
- 校對人:孟帥洋(書緣)