共用方式為


第 2 部分:控制器

作者 :JonGaloway

MVC 音樂市集是一個教學課程應用程式,會介紹並說明如何使用 ASP.NET MVC 和 Visual Studio 進行 Web 開發。

MVC 音樂市集是輕量型的市集實作,可線上銷售音樂相簿,並實作基本網站管理、使用者登入和購物車功能。

本教學課程系列詳細說明建置 ASP.NET MVC 音樂市集範例應用程式所採取的所有步驟。 第 2 部分涵蓋控制器。

透過傳統的 Web 架構,傳入 URL 通常會對應至磁片上的檔案。 例如:「/Products.aspx」 或 「/Products.php」 等 URL 的要求,可能會由 「Products.aspx」 或 「Products.php」 檔案處理。

以 Web 為基礎的 MVC 架構會以稍微不同的方式,將 URL 對應至伺服器程式碼。 它們會改為將 URL 對應至類別上的方法,而不是將傳入 URL 對應至檔案。 這些類別稱為「控制器」,且負責處理傳入的 HTTP 要求、處理使用者輸入、擷取和儲存資料,以及判斷要傳送回用戶端的回應 (顯示 HTML、下載檔案、重新導向至不同的 URL 等) 。

新增 HomeController

我們將藉由新增控制器類別來處理網站首頁的 URL,以開始我們的 MVC 音樂市集應用程式。 我們將遵循 ASP.NET MVC 的預設命名慣例,並將其命名為 HomeController。

以滑鼠右鍵按一下方案總管內的 [控制器] 資料夾,然後選取 [新增],然後選取 [控制器...]。命令:

將主控制項選項新增至音樂市集的不同清單選項螢幕擷取畫面。

這會顯示 [新增控制器] 對話方塊。 將控制器命名為 「HomeController」,然後按 [新增] 按鈕。

[主控制器] 對話方塊的螢幕擷取畫面,其中包含建立按鈕的不同選項。

這會使用下列程式碼建立新的檔案 HomeController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace MvcMusicStore.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
        public ActionResult Index()
        {
            return View();
        }
    }
}

若要盡可能開始,讓我們以只傳回字串的簡單方法取代 Index 方法。 我們將進行兩項變更:

  • 變更 方法以傳回字串,而不是 ActionResult
  • 變更 return 語句以傳回 「Hello from Home」

方法現在看起來應該像這樣:

public string Index()
{
    return "Hello from Home";
}

執行應用程式

現在讓我們執行網站。 我們可以啟動網頁伺服器,並使用下列任何一項來試用網站:

  • 選擇 [偵錯] ⇨ [開始偵錯] 功能表項目
  • 按一下工具列中的 [綠色箭號] 按鈕 音樂市集工具列選項的螢幕擷取畫面,強調偵錯選項,並標示箭號以按一下以指示應用程式執行偵錯功能。
  • 使用鍵盤快速鍵 F5。

使用上述任何步驟將會編譯我們的專案,然後導致內建 Visual Web Developer 的 ASP.NET Development Server 開始。 通知會出現在畫面底部的角落,以指出 ASP.NET 開發伺服器已啟動,並會顯示其執行所在的埠號碼。

顯示在頁面右下角的快顯通知螢幕擷取畫面,指出開發伺服器已在 localhost 26641 中啟動。

Visual Web 開發人員接著會自動開啟瀏覽器視窗,其 URL 指向我們的網頁伺服器。 這可讓我們快速試用 Web 應用程式:

瀏覽器視窗的螢幕擷取畫面,此視窗會在 localhost 中啟動開發伺服器時自動啟動。視窗會在瀏覽器中顯示 'hello from home' 字組。

沒關係,這相當快速 – 我們建立了新的網站、新增了三行函式,而且我們在瀏覽器中有文字。 不是火箭科學,而是一個起點。

注意:Visual Web 開發人員包含 ASP.NET 開發伺服器,這會在隨機免費的「埠」號碼上執行您的網站。 在上述螢幕擷取畫面中,月臺正在執行于 http://localhost:26641/ ,因此會使用埠 26641。 您的埠號碼將會不同。 當我們在本教學課程中討論 URL 類似 /Store/Browse 時,這會在埠號碼之後。 假設埠號碼為 26641,則流覽至 /Store/Browse 表示流覽至 http://localhost:26641/Store/Browse

新增 StoreController

我們新增了可實作網站首頁的簡單 HomeController。 現在讓我們新增另一個控制器,我們將用來實作音樂市集的流覽功能。 我們的市集控制器將支援三種案例:

  • 音樂市集中音樂內容類型的清單頁面
  • 列出特定內容類型中所有音樂相簿的流覽頁面
  • 顯示特定音樂相簿相關資訊的詳細資料頁面

我們將從新增 StoreController 類別開始。 如果您尚未執行,請關閉瀏覽器或選取 [偵錯] ⇨ [停止偵錯] 功能表項目,停止執行應用程式。

現在新增 StoreController。 就像我們與 HomeController 一樣,我們會以滑鼠右鍵按一下方案總管內的 [控制器] 資料夾,然後選擇 [新增 > 控制器] 功能表項目,以執行此動作

視窗功能表的螢幕擷取畫面,其中選取專案可將市集控制器選項新增至音樂市集應用程式。

我們的新 StoreController 已經有 「Index」 方法。 我們將使用此「索引」方法來實作列出音樂市集中所有內容類型的清單頁面。 我們也會新增兩個額外的方法來實作我們想要讓 StoreController 處理的其他兩個案例:流覽和詳細資料。

這些方法 (Index、Browse 和 Details) ,稱為「控制器動作」,如同您在 HomeController.Index () 動作方法中所見,其工作是要回應 URL 要求, (通常) 判斷應該將哪些內容傳回給叫用 URL 的瀏覽器或使用者。

我們將藉由變更Index () 方法以傳回字串 「Hello from Store.Index () 」 來啟動 StoreController 實作,我們將新增類似的流覽方法 () 和詳細資料 () :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace MvcMusicStore.Controllers
{
    public class StoreController : Controller
    {
        //
        // GET: /Store/
        public string Index()
        {
            return "Hello from Store.Index()";
        }
        //
        // GET: /Store/Browse
        public string Browse()
        {
            return "Hello from Store.Browse()";
        }
        //
        // GET: /Store/Details
        public string Details()
        {
            return "Hello from Store.Details()";
        }
    }
}

再次執行專案並流覽下列 URL:

  • /商店
  • /Store/Browse
  • /Store/Details

存取這些 URL 將會叫用控制器內的動作方法,並傳回字串回應:

視窗瀏覽器的螢幕擷取畫面,其中顯示存取 U R L 時叫用的動作方法範例。它會顯示下列字串回應:Hello from Store.Details ()

這很好,但這些只是常數位符串。 讓我們讓它們變成動態,讓他們從 URL 取得資訊,並在頁面輸出中顯示它。

首先,我們將變更 Browse 巨集指令方法,以從 URL 擷取查詢字串值。 我們可以藉由將「內容類型」參數新增至我們的動作方法來執行此動作。 當我們這樣做時 ASP.NET MVC 會在叫用時,自動將任何名為 「內容類型」 的查詢字串或表單 post 參數傳遞至我們的動作方法。

//
// GET: /Store/Browse?genre=Disco
public string Browse(string genre)
 {
    string message = HttpUtility.HtmlEncode("Store.Browse, Genre = "
+ genre);
 
    return message;
 }

注意:我們使用 HttpUtility.HtmlEncode 公用程式方法來清理使用者輸入。 這可防止使用者以 /Store/Browse 之類的連結將 JAVAscript 插入我們的檢視中?內容類型= < 腳本 > 視窗.location=' http://hackersite.com ' < /script > 。

現在讓我們流覽至 /Store/Browse?內容類型=Disco

此螢幕擷取畫面顯示另一個字串範例 (Store.Browse, Genre = Disco = Disco) 在將 'genre' 參數新增至其中時擷取查詢字串值時,由 URL 傳回。

接下來,讓我們變更 [詳細資料] 動作,以讀取和顯示名為 ID 的輸入參數。 不同于先前的方法,我們不會將識別碼值內嵌為 querystring 參數。 相反地,我們會將它直接內嵌在 URL 本身內。 例如:/Store/Details/5。

ASP.NET MVC 可讓您輕鬆地執行這項操作,而不需要設定任何專案。 ASP.NET MVC 的預設路由慣例是在動作方法名稱後面將 URL 的區段視為名為 「ID」 的參數。 如果您的動作方法有名為 ID 的參數,ASP.NET MVC 會自動將 URL 區段傳遞給您作為參數。

//
// GET: /Store/Details/5
public string Details(int id)
 {
    string message = "Store.Details, ID = " + id;
 
    return message;
 }

執行應用程式並流覽至 /Store/Details/5:

從 U R L 區段傳遞之參數的螢幕擷取畫面。參數是讀取 Store.Details, ID=5 的字串。

讓我們回顧到目前為止已完成的工作:

  • 我們已在 Visual Web Developer 中建立新的 ASP.NET MVC 專案
  • 我們已討論 ASP.NET MVC 應用程式的基本資料夾結構
  • 我們已瞭解如何使用 ASP.NET 開發伺服器執行網站
  • 我們已建立兩個控制器類別:HomeController 和 StoreController
  • 我們已將動作方法新增至控制器,以回應 URL 要求,並將文字傳回瀏覽器