模型-視圖-控制器 (MVC) 體系結(jié)構(gòu)模式將應(yīng)用分成 3 個(gè)主要組件:模型 (M)、視圖 (V) 和控制器 (C)。MVC 模式有助于創(chuàng)建比傳統(tǒng)單片應(yīng)用更易于測(cè)試和更新的應(yīng)用。 基于 MVC 的應(yīng)用包含:
MVC 模式可幫助創(chuàng)建分隔不同應(yīng)用特性(輸入邏輯、業(yè)務(wù)邏輯和 UI 邏輯)的應(yīng)用,同時(shí)讓這些元素之間實(shí)現(xiàn)松散耦合。 該模式可指定應(yīng)用中每種邏輯的位置。 UI 邏輯位于視圖中。 輸入邏輯位于控制器中。 業(yè)務(wù)邏輯位于模型中。 這種隔離有助于控制構(gòu)建應(yīng)用時(shí)的復(fù)雜程度,因?yàn)樗捎糜谝淮翁幚硪粋€(gè)實(shí)現(xiàn)特性,而不影響其他特性的代碼。 例如,處理視圖代碼時(shí)不必依賴業(yè)務(wù)邏輯代碼。
本教程系列中介紹了這些概念,并展示了如何使用它們構(gòu)建電影應(yīng)用。 MVC 項(xiàng)目包含“控制器”和“視圖”文件夾。
在“解決方案資源管理器”中,右鍵單擊“控制器”,然后單擊“添加”>“控制器”
在“添加基架”對(duì)話框中,選擇“MVC 控制器 - 空”
在“添加空 MVC 控制器”對(duì)話框中,輸入 HelloWorldController 并選擇“ADD”。
將“Controllers/HelloWorldController.cs”的內(nèi)容替換為以下內(nèi)容:
C#
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...";
}
}
}
控制器中的每個(gè) public 方法均可作為 HTTP 終結(jié)點(diǎn)調(diào)用。 上述示例中,兩種方法均返回一個(gè)字符串。 請(qǐng)注意每個(gè)方法前面的注釋。
HTTP 終結(jié)點(diǎn)是 Web 應(yīng)用程序中可定向的 URL(例如 https://localhost:5001/HelloWorld),其中結(jié)合了所用的協(xié)議 HTTPS、TCP 端口等 Web 服務(wù)器的網(wǎng)絡(luò)位置 localhost:5001,以及目標(biāo) URI HelloWorld。
第一條注釋指出這是一個(gè) HTTP GET 方法,它通過向基 URL 追加 /HelloWorld/ 進(jìn)行調(diào)用。 第二條注釋指定一個(gè) HTTP GET 方法,它通過向 URL 追加 /HelloWorld/Welcome/ 進(jìn)行調(diào)用。 本教程稍后將使用基架引擎生成 HTTP POST 方法,用于更新數(shù)據(jù)。
在非調(diào)試模式下運(yùn)行應(yīng)用,并將“HelloWorld”追加到地址欄中的路徑。 Index 方法返回一個(gè)字符串。
MVC 根據(jù)入站 URL 調(diào)用控制器類(及其中的操作方法)。 MVC 所用的默認(rèn) URL 路由邏輯使用如下格式來確定調(diào)用的代碼:
/[Controller]/[ActionName]/[Parameters]
在 Startup.cs 文件的 Configure 方法中設(shè)置路由格式。
C#
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
如果瀏覽到應(yīng)用且不提供任何 URL 段,它將默認(rèn)為上面突出顯示的模板行中指定的“Home”控制器和“Index”方法。
第一個(gè) URL 段決定要運(yùn)行的控制器類。 因此 localhost:xxxx/HelloWorld 映射到 HelloWorldController 類。 該 URL 段的第二部分決定類上的操作方法。 因此 localhost:xxxx/HelloWorld/Index 將觸發(fā) HelloWorldController 類的 Index 運(yùn)行。 請(qǐng)注意,只需瀏覽到 localhost:xxxx/HelloWorld,而 Index 方法默認(rèn)調(diào)用。 原因是 Index 是默認(rèn)方法,如果未顯式指定方法名稱,則將在控制器上調(diào)用它。 URL 段的第三部分 (id) 針對(duì)的是路由數(shù)據(jù)。 本教程的后續(xù)部分中將介紹路由數(shù)據(jù)。
瀏覽到 https://localhost:xxxx/HelloWorld/Welcome。 Welcome 方法將運(yùn)行并返回字符串 This is the Welcome action method...。 對(duì)于此 URL,采用 HelloWorld 控制器和 Welcome 操作方法。 目前尚未使用 URL 的 [Parameters] 部分。
修改代碼,將一些參數(shù)信息從 URL 傳遞到控制器。 例如 /HelloWorld/Welcome?name=Rick&numtimes=4。 更改 Welcome 方法以包括以下代碼中顯示的兩個(gè)參數(shù):
C#
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
前面的代碼:
運(yùn)行應(yīng)用并瀏覽到:
https://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4
(將 xxxx 替換為端口號(hào)。)可在 URL 中對(duì) name 和 numtimes 使用其他值。 MVC 模型綁定系統(tǒng)可將命名參數(shù)從地址欄中的查詢字符串自動(dòng)映射到方法中的參數(shù)。 有關(guān)詳細(xì)信息,請(qǐng)參閱模型綁定。
在上圖中,未使用 URL 段 (Parameters),且 name 和 numTimes 參數(shù)作為查詢字符串進(jìn)行傳遞。 上述 URL 中的 ?(問號(hào))為分隔符,后接查詢字符串。 & 字符用于分隔查詢字符串。
將 Welcome 方法替換為以下代碼:
C#
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
運(yùn)行應(yīng)用并輸入以下 URL:https://localhost:xxx/HelloWorld/Welcome/3?name=Rick
此時(shí),第三個(gè) URL 段與路由參數(shù) id 相匹配。 Welcome 方法包含 MapRoute 方法中匹配 URL 模板的參數(shù) id。 后面的 ?(id? 中)表示 id 參數(shù)可選。
C#
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
上述示例中,控制器始終執(zhí)行 MVC 的“VC”部分,即視圖和控制器工作。 控制器將直接返回 HTML。通常不希望控制器直接返回 HTML,因?yàn)榫幋a和維護(hù)非常繁瑣。 通常,需使用單獨(dú)的 Razor 視圖模板文件來幫助生成 HTML 響應(yīng)。 可在下一教程中執(zhí)行該操作。
更多建議: