新增控制器

作者: Rick Anderson

注意

本教學課程的更新版本 可在這裡 使用最新版本的 Visual Studio。 新的教學課程會使用 ASP.NET Core MVC,這可針對本教學課程提供許多改善。

本教學課程可讓您了解 ASP.NET Core MVC 與控制器和檢視。 Razor Pages 是 ASP.NET Core 的新替代方案,這是一種頁面型程序設計模型,可讓建置 Web UI 變得更簡單且更具生產力。 建議您在嘗試使用 MVC 版本之前,先試試 Razor 頁面教學課程。 Razor 頁面教學課程:

  • 比較容易學習。
  • 涵蓋更多功能。
  • 這是新應用程式開發的慣用方法。

MVC 代表 model-view-controller。 MVC 是開發架構良好、可測試且容易維護之應用程式的模式。 以 MVC 為基礎的應用程式包含:

  • M odels:代表應用程式數據的類別,以及使用驗證邏輯來強制執行該數據的商務規則。
  • V iews:應用程式用來動態產生 HTML 回應的範本檔案。
  • C ontrollers:處理傳入瀏覽器要求的類別、擷取模型數據,然後指定檢視範本以傳回瀏覽器的回應。

我們將涵蓋本教學課程系列中的所有概念,並示範如何使用它們來建置應用程式。

讓我們從建立控制器類別開始。 在 [方案總管] 中,以滑鼠右鍵按兩下 Controllers 資料夾,然後按兩下 [新增],然後按兩下 [控制器]。

顯示 方案總管 視窗的螢幕快照。控制器以滑鼠右鍵按單,且 [新增] 子功能表隨即開啟。

在 [ 新增 Scaffold ] 對話框中,按兩下 [MVC 5 控制器 - 空白],然後按兩下 [ 新增]。

顯示 [新增 Scaffold] 對話框的螢幕快照。已選取 [M V C 5 控制器空白]。

將您的新控制器命名為 「HelloWorldController」,然後按兩下 [ 新增]。

新增控制器

請注意,方案總管 已建立名為 HelloWorldController.cs 的新檔案,以及新的資料夾 Views\HelloWorld。 控制器會在 IDE 中開啟。

顯示 [Hello World 控制器點 c] 索引標籤開啟的螢幕快照。在 方案總管 中,Hello World 控制器點 c 子資料夾和 Hello World 子資料夾會以紅色圓圈。

以下列程式碼取代檔案的內容。

using System.Web;
using System.Web.Mvc; 
 
namespace MvcMovie.Controllers 
{ 
    public class HelloWorldController : Controller 
    { 
        // 
        // GET: /HelloWorld/ 
 
        public string Index() 
        { 
            return "This is my <b>default</b> action..."; 
        } 
 
        // 
        // GET: /HelloWorld/Welcome/ 
 
        public string Welcome() 
        { 
            return "This is the Welcome action method..."; 
        } 
    } 
}

控制器方法會以範例傳回 HTML 字串。 控制器的名稱為 HelloWorldController ,而第一個方法名為 Index。 讓我們從瀏覽器叫用它。 執行應用程式 (按 F5 或 Ctrl+F5) 。 在瀏覽器中,將 「HelloWorld」 附加至網址列中的路徑。 (例如,下圖 http://localhost:1234/HelloWorld.) 瀏覽器中的頁面看起來會像下列螢幕快照。 在上述方法中,程式代碼會直接傳回字串。 您已告訴系統只傳回一些 HTML,而且確實這麼做了!

顯示 [本機主機] 索引標籤的螢幕快照,其中包含視窗中的預設動作。

ASP.NET MVC 會根據傳入 URL 叫用不同的控制器類別, (和它們內的不同動作方法) 。 ASP.NET MVC 所使用的預設 URL 路由邏輯會使用如下的格式來判斷要叫用的程式代碼:

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

您可以在 App_Start/RouteConfig.cs 檔案中設定路由的格式。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

當您執行應用程式且未提供任何 URL 區段時,它會預設為上述程式代碼的 defaults 區段中指定的 「Home」 控制器和 「Index」 動作方法。

URL 的第一個部分會決定要執行的控制器類別。 因此 /HelloWorld 會對應至 HelloWorldController 類別。 URL 的第二個部分會決定要執行的類別上的動作方法。 因此 ,/HelloWorld/Index 會導致 Index 類別的 HelloWorldController 方法執行。 請注意,我們只需要流覽至 /HelloWorld ,而且 Index 預設會使用 方法。 這是因為名為 Index 的方法是預設方法,如果未明確指定,則會在控制器上呼叫此方法。 URL 區段的第三個部分 (Parameters) 是路由資料。 我們稍後會在本教學課程中看到路由數據。

瀏覽至 http://localhost:xxxx/HelloWorld/WelcomeWelcome 方法隨即執行,並傳回字串 "This is the Welcome action method..."。 預設 MVC 對應為 /[Controller]/[ActionName]/[Parameters]。 在此 URL 中,控制器是 HelloWorld,而 Welcome 是動作方法。 您尚未使用 URL 的 [Parameters] 部分。

顯示本機主機索引標籤的螢幕快照,其中文字為視窗中的歡迎動作方法。

讓我們稍微修改範例,以便您將一些參數資訊從 URL 傳遞至控制器 (例如 /HelloWorld/Welcome?name=Scott&numtimes=4) 。 變更方法 Welcome 以包含兩個參數,如下所示。 請注意,程式代碼會使用 C# 選擇性參數功能來 numTimes 指出,如果未針對該參數傳遞任何值,則參數應該預設為 1。

public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

注意

安全性注意事項:上述程式代碼會使用 HttpUtility.HtmlEncode 來保護應用程式免於惡意輸入 (也就是 JavaScript) 。 如需詳細資訊,請參閱 如何:將 HTML 編碼套用至字元串,以防止 Web 應用程式中的腳本惡意探索。

執行您的應用程式,並流覽至範例 URL (http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4) 。 您可以在 URL 中針對 namenumtimes 嘗試不同的值。 ASP.NET MVC 模型系結系統會自動將網址列中查詢字串中的具名參數對應至方法中的參數。

顯示瀏覽器視窗的螢幕快照,其中 U R L 本機主機冒號 1 2 3 4 正斜線 Hello World 正斜線歡迎問號名稱等於 Scott,而 num 次等於 4。視窗中的文字為 Hello Scott Num Times 為 4。

在上述範例中,不會使用 URL 區段 ( Parameters) , name 而且 參數 numTimes 會當做 查詢字串傳遞。 ? (上述 URL 中的問號) 是分隔符,且查詢字串如下。 & 字元會分隔查詢字串。

以下列程序代碼取代 Welcome 方法:

public string Welcome(string name, int ID = 1)
{
    return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID);
}

執行應用程式並輸入下列 URL: http://localhost:xxx/HelloWorld/Welcome/1?name=Scott

顯示瀏覽器視窗的螢幕快照,其中U R L 本機主機冒號1 2 3 4 正斜線 Hello World 正斜線歡迎斜線 1 問號名稱等於 scott。視窗中的文字為 Hello Scott ID 1。

這次第三個 URL 區段符合路由參數 ID. 動作 Welcome 方法包含參數 (ID) 符合 方法中 URL 規格的參數 RegisterRoutes

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

在 ASP.NET MVC 應用程式中,比以查詢字串的形式傳遞參數,就像我們在上述標識碼) 一樣,將參數當做路由數據傳遞 (比較常見。 您也可以新增路由,以將 namenumtimes 傳入參數當做URL中的路由數據。 在 App_Start\RouteConfig.cs 檔案中,新增 “Hello” 路由:

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

      routes.MapRoute(
           name: "Hello",
           url: "{controller}/{action}/{name}/{id}"
       );
   }
}

執行應用程式並瀏覽至 /localhost:XXX/HelloWorld/Welcome/Scott/3

顯示瀏覽器視窗的螢幕快照,其中具有U R L 本機主機冒號1 2 3 4正斜線 Hello World 正斜線歡迎斜線 Scott 正斜線 3。視窗中的文字為 Hello Scott ID 3。

對於許多MVC應用程式,預設路由運作正常。 您稍後會在本教學課程中瞭解如何使用模型系結器來傳遞數據,而且您不需要修改該路由的預設路由。

在這些範例中,控制器已執行MVC的 「VC」 部分,也就是檢視和控制器工作。 控制器會直接傳回 HTML。 通常您不希望控制器直接傳回 HTML,因為這對程式代碼而言非常麻煩。 相反地,我們通常會使用個別的檢視範本檔案來協助產生 HTML 回應。 讓我們看看如何執行這項操作。