將控制器添加到 ASP.NET Core MVC 應(yīng)用

2019-04-17 08:57 更新

模型-視圖-控制器 (MVC) 體系結(jié)構(gòu)模式將應(yīng)用分成 3 個(gè)主要組件:模型 (M)、視圖 (V) 和控制器 (C)。MVC 模式有助于創(chuàng)建比傳統(tǒng)單片應(yīng)用更易于測(cè)試和更新的應(yīng)用。 基于 MVC 的應(yīng)用包含:

  • 模型 (M):表示應(yīng)用數(shù)據(jù)的類。 模型類使用驗(yàn)證邏輯來對(duì)該數(shù)據(jù)強(qiáng)制實(shí)施業(yè)務(wù)規(guī)則。 通常,模型對(duì)象檢索模型狀態(tài)并將其存儲(chǔ)在數(shù)據(jù)庫中。 本教程中,Movie 模型將從數(shù)據(jù)庫中檢索電影數(shù)據(jù),并將其提供給視圖或?qū)ζ溥M(jìn)行更新。 更新后的數(shù)據(jù)將寫入到數(shù)據(jù)庫。
  • 視圖 (V):視圖是顯示應(yīng)用用戶界面 (UI) 的組件。 此 UI 通常會(huì)顯示模型數(shù)據(jù)。
  • 控制器 (C):處理瀏覽器請(qǐng)求的類。 它們檢索模型數(shù)據(jù)并調(diào)用返回響應(yīng)的視圖模板。 在 MVC 應(yīng)用中,視圖僅顯示信息;控制器處理并響應(yīng)用戶輸入和交互。 例如,控制器處理路由數(shù)據(jù)和查詢字符串值,并將這些值傳遞給模型。 該模型可使用這些值查詢數(shù)據(jù)庫。 例如,https://localhost:1234/Home/About 具有 Home(控制器)的路由數(shù)據(jù)和 About(在 Home 控制器上調(diào)用的操作方法)。 https://localhost:1234/Movies/Edit/5 是一個(gè)請(qǐng)求,用于通過電影控制器編輯 ID 為 5 的電影。 本教程的后續(xù)部分中將介紹路由數(shù)據(jù)。

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 控制器并為其命名

  • 在“添加空 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è)字符串。

顯示“這是我的默認(rèn)操作”應(yīng)用程序響應(yīng)的瀏覽器窗口

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] 部分。

顯示“這是 Welcome 操作方法”應(yīng)用程序響應(yīng)的瀏覽器窗口

修改代碼,將一些參數(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}");
}

前面的代碼:

  • 使用 C# 可選參數(shù)功能指示,未為 numTimes 參數(shù)傳遞值時(shí)該參數(shù)默認(rèn)為 1。
  • 使用 HtmlEncoder.Default.Encode 防止惡意輸入(即 JavaScript)損害應(yīng)用。
  • 在 $"Hello {name}, NumTimes is: {numTimes}" 中使用內(nèi)插字符串

運(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)參閱模型綁定。

顯示應(yīng)用程序響應(yīng)的瀏覽器窗口,響應(yīng)為:你好 Rick,NumTimes 為4

在上圖中,未使用 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í)行該操作。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)