了解模型、檢視和控制器 (C#)

作者 :Stephen Walther

對模型、檢視和控制器感到困惑嗎? 在本教學課程中,Stephen Walther 為您介紹 ASP.NET MVC 應用程式的不同部分。

本教學課程提供 ASP.NET MVC 模型、檢視和控制器的高階概觀。 換句話說,它會說明 ASP.NET MVC 中的 M'、V' 和 C'。

閱讀本教學課程之後,您應該瞭解 ASP.NET MVC 應用程式的不同部分如何共同運作。 您也應該瞭解 ASP.NET MVC 應用程式的架構與 ASP.NET Web Forms應用程式或 Active Server Pages 應用程式有何不同。

範例 ASP.NET MVC 應用程式

用來建立 ASP.NET MVC Web 應用程式的預設 Visual Studio 範本包含非常簡單的範例應用程式,可用來瞭解 ASP.NET MVC 應用程式的不同部分。 在本教學課程中,我們會利用這個簡單的應用程式。

您可以使用 MVC 範本建立新的 ASP.NET MVC 應用程式,方法是啟動 Visual Studio 2008 並選取功能表選項 [檔案]、[新增專案] (請參閱圖 1) 。 在 [新增專案] 對話方塊中,選取 [專案類型 (Visual Basic] 或 [C#] 底下的 [我的最愛程式設計語言]) ,然後在 [範本] 底下選取 [ASP.NET MVC Web 應用程式 ]。 按一下 [確定] 按鈕。

新增專案對話方塊

圖 01:[新增專案] 對話方塊 (按一下即可檢視完整大小的影像)

當您建立新的 ASP.NET MVC 應用程式時,[ 建立單元測試專案 ] 對話方塊隨即出現, (請參閱圖 2) 。 此對話方塊可讓您在方案中建立個別的專案,以測試 ASP.NET MVC 應用程式。 選取 [ 否],不要建立單元測試專案 ,然後按一下 [ 確定 ] 按鈕。

建立單元測試對話方塊

圖 02:建立單元測試對話方塊 (按一下即可檢視完整大小的影像)

建立新的 ASP.NET MVC 應用程式之後。 您會在 [方案總管] 視窗中看到數個資料夾和檔案。 特別是,您會看到三個名為 Models、Views 和 Controllers 的資料夾。 您可能會從資料夾名稱猜測,這些資料夾包含用來實作模型、檢視和控制器的檔案。

如果您展開 Controllers 資料夾,您應該會看到名為 AccountController.cs 的檔案,以及名為 HomeController.cs 的檔案。 如果您展開 [檢視] 資料夾,您應該會看到三個名為 Account、Home 和 Shared 的子資料夾。 如果您展開 [首頁] 資料夾,您會看到兩個名為 About.aspx 和 Index.aspx 的其他檔案 (請參閱圖 3) 。 這些檔案組成預設 ASP.NET MVC 範本隨附的範例應用程式。

方案總管視窗

圖 03:方案總管視窗 (按一下以檢視大小完整的影像)

您可以選取 [偵錯 ]、[開始偵錯] 功能表選項來執行範例應用程式。 或者,您可以按 F5 鍵。

當您第一次執行 ASP.NET 應用程式時,圖 4 中的對話方塊隨即出現,建議您啟用偵錯模式。 按一下 [確定] 按鈕,應用程式將會執行。

[未啟用偵錯] 對話方塊

圖 04:[未啟用偵錯] 對話方塊 (按一下即可檢視大小完整的映射)

當您執行 ASP.NET MVC 應用程式時,Visual Studio 會在網頁瀏覽器中啟動應用程式。 範例應用程式只包含兩個頁面:[索引] 頁面和 [關於] 頁面。 應用程式第一次啟動時,[索引] 頁面會出現 (請參閱圖 5) 。 您可以按一下應用程式右上方的功能表連結,流覽至 [關於] 頁面。

索引頁

圖 05:索引頁面 (按一下即可檢視完整大小的影像)

請注意瀏覽器網址列中的 URL。 例如,當您按一下 [關於] 功能表連結時,瀏覽器網址列中的 URL 會變更為 /Home/About

如果您關閉瀏覽器視窗並返回 Visual Studio,您將無法找到路徑為 Home/About 的檔案。 檔案不存在。 為何會發生此情形?

URL 不等於頁面

當您建置傳統的 ASP.NET Web Forms應用程式或 Active Server Pages 應用程式時,URL 與頁面之間會有一對一的對應。 如果您從伺服器要求名為 SomePage.aspx 的頁面,則磁片上最好有一個名為 SomePage.aspx 的頁面。 如果 SomePage.aspx 檔案不存在,您會收到 404 - 找不到頁面 的錯誤。

建置 ASP.NET MVC 應用程式時,您輸入瀏覽器網址列的 URL 與您在應用程式中找到的檔案之間沒有對應。 在 ASP.NET MVC 應用程式中,URL 會對應至控制器動作,而不是磁片上的頁面。

在傳統的 ASP.NET 或 ASP 應用程式中,瀏覽器要求會對應至頁面。 相反地,在 ASP.NET MVC 應用程式中,瀏覽器要求會對應至控制器動作。 ASP.NET Web Forms應用程式是以內容為中心的。 相反地,ASP.NET MVC 應用程式是以應用程式邏輯為主。

瞭解 ASP.NET 路由

瀏覽器要求會透過名為 ASP.NET 路由的 ASP.NET 架構功能,對應至控制器動作。 ASP.NET 路由是由 ASP.NET MVC 架構用來將傳入要求 路由 傳送至控制器動作。

ASP.NET 路由會使用路由表來處理傳入要求。 當您的 Web 應用程式第一次啟動時,就會建立此路由表。 路由表是在 Global.asax 檔案中設定的。 預設 MVC Global.asax 檔案包含在清單 1 中。

清單 1 - Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit https://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

第一次啟動 ASP.NET 應用程式時,會呼叫 Application_Start () 方法。 在清單 1 中,這個方法會呼叫 RegisterRoutes () 方法,而 RegisterRoutes () 方法會建立預設路由表。

預設路由表包含一個路由。 此預設路由會將所有連入要求分成三個區段, (URL 區段是正斜線之間的任何專案) 。 第一個區段會對應至控制器名稱、第二個區段對應至動作名稱,最後一個區段會對應至傳遞至名為 Id 之動作的參數。

例如,請考慮下列 URL:

/Product/Details/3

此 URL 會剖析成三個參數,如下所示:

控制器 = 產品

動作 = 詳細資料

識別碼 = 3

Global.asax 檔案中定義的預設路由包含所有三個參數的預設值。 預設控制器為 Home、預設動作為 Index,而預設識別碼為空字串。 請記住這些預設值,請考慮剖析下列 URL 的方式:

/Employee

此 URL 會剖析成三個參數,如下所示:

控制器 = 員工

動作 = 索引

Id =

最後,如果您開啟 ASP.NET MVC 應用程式而不提供任何 URL (, http://localhost) URL 會像這樣剖析:

控制器 = 首頁

動作 = 索引

Id =

要求會路由傳送至 HomeController 類別上的 Index () 動作。

瞭解控制器

控制器負責控制使用者與 MVC 應用程式互動的方式。 控制器包含 ASP.NET MVC 應用程式的流程式控制制邏輯。 控制器會決定當使用者提出瀏覽器要求時,要傳回給使用者的回應。

控制器只是類別 (,例如 Visual Basic 或 C# 類別) 。 範例 ASP.NET MVC 應用程式包含位於 Controllers 資料夾中名為 HomeController.cs 的控制器。 HomeController.cs 檔案的內容會在清單 2 中重現。

清單 2 - HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Title"] = "Home Page";
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            ViewData["Title"] = "About Page";

            return View();
        }
    }
}

請注意,HomeController 有兩個名為 Index () 和 About () 的方法。 這兩種方法會對應至控制器所公開的兩個動作。 URL /Home/Index 會叫用 HomeController.Index () 方法,而 URL /Home/About 會叫用 HomeController.About () 方法。

控制器中的任何公用方法都會公開為控制器動作。 您必須注意這一點。 這表示任何包含于控制器中的公用方法,都可以透過在瀏覽器中輸入正確的 URL,讓任何可存取網際網路的人叫用。

了解檢視

HomeController 類別、Index () 和 About () 公開的兩個控制器動作都會傳回檢視。 檢視包含傳送至瀏覽器的 HTML 標籤和內容。 使用 ASP.NET MVC 應用程式時,檢視相當於頁面。

您必須在正確的位置建立檢視。 HomeController.Index () 巨集指令會傳回位於下列路徑的檢視:

\Views\Home\Index.aspx

HomeController.About () 巨集指令會傳回位於下列路徑的檢視:

\Views\Home\About.aspx

一般而言,如果您想要傳回控制器動作的檢視,則需要在 Views 資料夾中建立與控制器同名的子資料夾。 在子資料夾中,您必須建立名稱與控制器動作相同的 .aspx 檔案。

清單 3 中的檔案包含 About.aspx 檢視。

清單 3 - About.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>About</h2>
    <p>
        Put content here.
    </p>
</asp:Content>

如果您忽略清單 3 中的第一行,則大部分檢視的其餘部分都包含標準 HTML。 您可以在這裡輸入任何您想要的 HTML 來修改檢視的內容。

檢視非常類似于使用中伺服器頁面或 ASP.NET Web Forms中的頁面。 檢視可以包含 HTML 內容和腳本。 您可以使用慣用的 .NET 程式設計語言撰寫腳本 (,例如 C# 或 Visual Basic .NET) 。 您可以使用腳本來顯示動態內容,例如資料庫資料。

瞭解模型

我們已討論控制器,並已討論過檢視。 我們需要討論的最後一個主題是模型。 什麼是 MVC 模型?

MVC 模型包含檢視或控制器中未包含的所有應用程式邏輯。 此模型應該包含您所有的應用程式商務邏輯、驗證邏輯和資料庫存取邏輯。 例如,如果您使用 Microsoft Entity Framework 來存取您的資料庫,您會在 Models 資料夾中 (.edmx 檔案) 建立 Entity Framework 類別。

檢視應該只包含與產生使用者介面相關的邏輯。 控制器應該只包含傳回正確檢視或將使用者重新導向至另一個動作所需的最小邏輯, (流量控制) 。 其他所有專案都應該包含在模型中。

一般而言,您應該努力使用 fat 模型和小費控制器。 您的控制器方法應該只包含幾行程式碼。 如果控制器動作太長,您應該考慮將邏輯移出 Models 資料夾中的新類別。

總結

本教學課程提供您 ASP.NET MVC Web 應用程式不同部分的高階概觀。 您已瞭解如何 ASP.NET 路由將傳入瀏覽器要求對應至特定的控制器動作。 您已瞭解控制器如何協調檢視傳回瀏覽器的方式。 最後,您已瞭解模型如何包含應用程式商務、驗證和資料庫存取邏輯。