[翻译: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應用程序不同組成部分的極為簡易的示例程序。
啟動Visual Studio 2008,用MVC模板新建一個ASP.NET MVC應用程序,然后選擇菜單選項File, New Project(見圖1)。在新建項目對話框中,在Project Types欄下選擇你所使用的編程語言(Visual Basic或C#),然后在Templates欄下選擇ASP.NET MVC Web Application。點擊OK按鈕。
圖1:新建項目對話框
當你創建ASP.NET MVC應用程序時,Create Unit Test Project對話框會出現(見圖2)。該對話框能讓你在你的解決方案中創建一個獨立的項目來測試你的ASP.NET MVC應用程序。選擇選項No, do not create a unit test project,然后點擊OK按鈕。
圖2:創建單元測試對話框
在新ASP.NET MVC應用程序創建后,你會在解決方案瀏覽窗口中看見一些文件夾和文件。個別的說,你將看見三個名為Models、Views和Controllers的文件夾。正如你從文件夾名猜到的那樣,三個文件夾包含了實現模型、視圖和控制器的文件。
如果你展開Controllers文件夾,你應當能看見名為AccountController.cs的文件和名為HomeController.cs的文件。如果你展開Views文件夾,你應當能看見名為Account、Home和Shared的三個子文件夾。如果你展開Home文件夾,你應當能看見名為About.aspx 和Index.aspx的兩個附加文件(見圖3)。這些文件組成了包含在默認ASP.NET MVC內的簡易應用程序。
圖3:解決方案瀏覽窗口
你可以運行該簡易程序通過選擇菜單選項Debug, Start Debugging或者按下F5鍵。
當你首次運行ASP.NET應用程序時,圖4中的對話框會出現并推薦你開啟調試模式。點擊OK按鈕,運行程序。
圖4:調試未啟用對話框
當你運行ASP.NET MVC應用程序時,Visual Studio在你的瀏覽器中啟動該程序。該簡易程序僅有兩個頁面:Index頁面和About頁面組成。當應用程序首次運行時,Index頁面會出現(見圖5)。你可以通過點擊應用程序右上角的菜單鏈接導航至About頁面。
圖5:Index頁面
注意到你瀏覽器地址欄中的URLs的變化。例如,當你點擊About菜單鏈接時,瀏覽器地址欄中的URL將轉變為/Home/About。
如果你關閉瀏覽器窗口并返回至Visual Studio,你將不能找到帶有路徑Home/About的文件。該文件不存在。這怎么可能呢?
一個URL不等于一個頁面
當你構建一個傳統的ASP.NET Web Forms應用程序或一個Active Server Pages應用程序時,在URL和頁面之間具有一對一對等的關系。如果你從服務器請求一個名為SomePage.aspx的頁面,那么服務器上就應當有一個名為SomePage.aspx的頁面。如果SomePage.aspx文件不存在,你將會得到一個難看的404 – Page Not Found錯誤。
當構建一個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 Routing(ASP.NET路由)的ASP.NET框架特性被映射到一個控制器動作中。ASP.NET MVC framework 使用ASP.NET路由來將進來的請求路由至控制器動作。
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 http://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像這樣被解析為三部分:
Controller = Product
Action = Details
Id = 3
在Global.asax定義的默認路由為這三個參數設定了默認值。默認控制器為Home、默認動作為Index以及默認Id為一個空字符串。記住這些默認值,考慮下列URL是怎樣被解析的:
/Employee
該URL像這樣被解析為三個參數:
Controller = Employee
Action = Index
Id = ??
最后,如果你打開一個不提供任何URL的ASP.NET MVC應用程序(例如,http://localhost/),那么該URL將會像這樣被解析為:
Controller = Home
Action = Index
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的連接到Internet的任意一人請求調用。
理解視圖
位列于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代碼來修改該視圖的內容。
一個視圖與位于Active Server Pages或ASP.NET Web Forms中的一個頁面是十分類似的。視圖能包含HTML內容及腳本代碼。你可用你最擅長的編程語言(例如,C#或Visual Basic)來編寫腳本代碼。你用這些腳本來顯示動態內容,諸如數據庫數據等。
理解模型
我們之前已討論了控制器及視圖。最后一個需要討論話題便是模型。一個MVC模型是什么呢?
一個MVC模型包含了所有你應用程序中不包含在視圖及控制器中的業務邏輯。該模型應當包含你應用程序的所有商業邏輯、驗證邏輯以及數據庫連接邏輯。例如,如果你使用Microsoft Entity Framework來連接到你的數據庫,那么你就在Models文件夾下創建了你的Entity Framework類(.edmx文件)。
視圖應當只能包含有關生成用戶界面的業務邏輯??刂破鲬斨话灰蠓祷刂琳_的視圖或讓用戶重新導向至另一個動作(控制流)的最精簡的業務邏輯。
一般來說,你應當力爭做到“胖模型”和“瘦控制器”。你的控制器方法應當只包含少量代碼。如果控制器動作代碼數量巨大,那么你應當考慮將該業務邏輯移出至Models文件夾下的一個新類中。
小結
本篇教程為你提供了ASP.NET MVC Web應用程序不同部分的高級概述。你了解了ASP.NET Routing是怎樣將進來的瀏覽器請求映射至指定的控制器動作中的,了解到控制器是怎樣精心安排傳回瀏覽器的視圖的。最后,你了解到模型是怎樣包含應用程序的商業邏輯、驗證邏輯和數據庫連接邏輯的。
作者:Kinglee文章出處:Kinglee’s Blog (http://www.cnblogs.com/Kinglee/)
版權聲明:本文的版權歸作者與博客園共有。轉載時須注明本文的詳細鏈接,否則作者將保留追究其法律責任。
轉載于:https://www.cnblogs.com/Kinglee/archive/2009/07/30/1534709.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的[翻译:ASP.NET MVC 教程]理解模型、视图和控制器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日文邮件变成乱码解决方案
- 下一篇: 自动关机故障常见排除法