將控制器添加到 ASP.NET Core MVC 應用

2019-04-17 08:57 更新

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

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

MVC 模式可幫助創(chuàng)建分隔不同應用特性(輸入邏輯、業(yè)務邏輯和 UI 邏輯)的應用,同時讓這些元素之間實現(xiàn)松散耦合。 該模式可指定應用中每種邏輯的位置。 UI 邏輯位于視圖中。 輸入邏輯位于控制器中。 業(yè)務邏輯位于模型中。 這種隔離有助于控制構建應用時的復雜程度,因為它可用于一次處理一個實現(xiàn)特性,而不影響其他特性的代碼。 例如,處理視圖代碼時不必依賴業(yè)務邏輯代碼。

本教程系列中介紹了這些概念,并展示了如何使用它們構建電影應用。 MVC 項目包含“控制器”和“視圖”文件夾。

添加控制器

  • 在“解決方案資源管理器”中,右鍵單擊“控制器”,然后單擊“添加”>“控制器” 上下文菜單

  • 在“添加基架”對話框中,選擇“MVC 控制器 - 空”

    添加 MVC 控制器并為其命名

  • 在“添加空 MVC 控制器”對話框中,輸入 HelloWorldController 并選擇“ADD”。

將“Controllers/HelloWorldController.cs”的內容替換為以下內容:

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...";
        }
    }
}

控制器中的每個 public 方法均可作為 HTTP 終結點調用。 上述示例中,兩種方法均返回一個字符串。 請注意每個方法前面的注釋。

HTTP 終結點是 Web 應用程序中可定向的 URL(例如 https://localhost:5001/HelloWorld),其中結合了所用的協(xié)議 HTTPS、TCP 端口等 Web 服務器的網絡位置 localhost:5001,以及目標 URI HelloWorld。

第一條注釋指出這是一個 HTTP GET 方法,它通過向基 URL 追加 /HelloWorld/ 進行調用。 第二條注釋指定一個 HTTP GET 方法,它通過向 URL 追加 /HelloWorld/Welcome/ 進行調用。 本教程稍后將使用基架引擎生成 HTTP POST 方法,用于更新數(shù)據。

在非調試模式下運行應用,并將“HelloWorld”追加到地址欄中的路徑。 Index 方法返回一個字符串。

顯示“這是我的默認操作”應用程序響應的瀏覽器窗口

MVC 根據入站 URL 調用控制器類(及其中的操作方法)。 MVC 所用的默認 URL 路由邏輯使用如下格式來確定調用的代碼:

/[Controller]/[ActionName]/[Parameters]

在 Startup.cs 文件的 Configure 方法中設置路由格式。

C#

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

如果瀏覽到應用且不提供任何 URL 段,它將默認為上面突出顯示的模板行中指定的“Home”控制器和“Index”方法。

第一個 URL 段決定要運行的控制器類。 因此 localhost:xxxx/HelloWorld 映射到 HelloWorldController 類。 該 URL 段的第二部分決定類上的操作方法。 因此 localhost:xxxx/HelloWorld/Index 將觸發(fā) HelloWorldController 類的 Index 運行。 請注意,只需瀏覽到 localhost:xxxx/HelloWorld,而 Index 方法默認調用。 原因是 Index 是默認方法,如果未顯式指定方法名稱,則將在控制器上調用它。 URL 段的第三部分 (id) 針對的是路由數(shù)據。 本教程的后續(xù)部分中將介紹路由數(shù)據。

瀏覽到 https://localhost:xxxx/HelloWorld/Welcome。 Welcome 方法將運行并返回字符串 This is the Welcome action method...。 對于此 URL,采用 HelloWorld 控制器和 Welcome 操作方法。 目前尚未使用 URL 的 [Parameters] 部分。

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

修改代碼,將一些參數(shù)信息從 URL 傳遞到控制器。 例如 /HelloWorld/Welcome?name=Rick&numtimes=4。 更改 Welcome 方法以包括以下代碼中顯示的兩個參數(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ù)默認為 1。
  • 使用 HtmlEncoder.Default.Encode 防止惡意輸入(即 JavaScript)損害應用。
  • 在 $"Hello {name}, NumTimes is: {numTimes}" 中使用內插字符串

運行應用并瀏覽到:

https://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4

(將 xxxx 替換為端口號。)可在 URL 中對 name 和 numtimes 使用其他值。 MVC 模型綁定系統(tǒng)可將命名參數(shù)從地址欄中的查詢字符串自動映射到方法中的參數(shù)。 有關詳細信息,請參閱模型綁定。

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

在上圖中,未使用 URL 段 (Parameters),且 name 和 numTimes 參數(shù)作為查詢字符串進行傳遞。 上述 URL 中的 ?(問號)為分隔符,后接查詢字符串。 & 字符用于分隔查詢字符串。

將 Welcome 方法替換為以下代碼:

C#

public string Welcome(string name, int ID = 1)
{
    return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}

運行應用并輸入以下 URL:https://localhost:xxx/HelloWorld/Welcome/3?name=Rick

此時,第三個 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,因為編碼和維護非常繁瑣。 通常,需使用單獨的 Razor 視圖模板文件來幫助生成 HTML 響應。 可在下一教程中執(zhí)行該操作。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號