學(xué)習(xí)ASP.NET MVC的基本概念
visual studio用于創(chuàng)建mvc的模板默認(rèn)包含了一個(gè)極其簡(jiǎn)單的mvc例子。通過(guò)這個(gè)例子你可以了解mvc應(yīng)用的不同部分組成。這里我們利用這個(gè)簡(jiǎn)單的例子進(jìn)行ASP.NET MVC基本概念的學(xué)習(xí)。
首先創(chuàng)建mvc應(yīng)用。這里我們還是不選擇添加測(cè)試項(xiàng)目。
創(chuàng)建成功后,可以看到一些文件夾和文件。你需要對(duì)Models,Views,Controllers這三個(gè)文件夾特別關(guān)注。顧名思義,這三個(gè)文件夾內(nèi)包含了m,v,c中的文件。
展開(kāi)controllers文件夾,我們可以看到一個(gè)叫做AccountController.cs的文件和一個(gè)HomeController.cs文件。Views文件夾下可以看到三個(gè)子文件夾 Account, Home and Shared。展開(kāi)Home文件夾,看到兩個(gè)文件About.aspx 和Index.aspx 。這些文件組成了我們這個(gè)mvc簡(jiǎn)單的實(shí)例。文件結(jié)構(gòu)如下圖
按F5運(yùn)行這個(gè)項(xiàng)目,如果是第一次運(yùn)行,會(huì)提示啟動(dòng)調(diào)試模式對(duì)話(huà)框。選擇確定。
這個(gè)簡(jiǎn)單的項(xiàng)目只含有兩個(gè)頁(yè)面:Index和About,當(dāng)程序第一次運(yùn)行的時(shí)候,瀏覽器呈現(xiàn)的是index頁(yè)面,可以通過(guò)右上部的導(dǎo)航定位到About頁(yè)面。
注意地址欄中的地址。例如:當(dāng)你點(diǎn)擊About按鈕時(shí),地址欄中的地址變?yōu)?Home/About.
關(guān)掉瀏覽器回到VS,你不會(huì)在/Home/About目錄中找到任何文件,這些文件是在該目錄是不存在的,但是為什么會(huì)這樣呢?
ASP.NET MVC基本概念:一個(gè)URL不等于一個(gè)頁(yè)面
當(dāng)你創(chuàng)建一個(gè)asp程序或asp.net web窗體程序時(shí),一個(gè)URL和一個(gè)頁(yè)面是一一對(duì)應(yīng)的。如果你向服務(wù)器請(qǐng)求一個(gè)頁(yè)面somepage.aspx,服務(wù)器磁盤(pán)上應(yīng)該有一個(gè)頁(yè)面叫做somepage.aspx,如果somepage.aspx不存在,你會(huì)得到一個(gè)404錯(cuò)誤提示。
但是mvc程序相比之下,你在地址欄中寫(xiě)入的地址與項(xiàng)目中的文件并不是一一對(duì)應(yīng)的。在mvc程序中,一個(gè)URL相當(dāng)于一個(gè)controller action,并不是一個(gè)aspx頁(yè)面。
在傳統(tǒng)的aspx程序中,瀏覽器請(qǐng)求被映射到頁(yè)面,在mvc程序中,瀏覽器請(qǐng)求被映射到controller action。web窗體應(yīng)用是以?xún)?nèi)容為中心,mvc應(yīng)用以程序邏輯為中心。
學(xué)習(xí)asp.net mvc 路徑
瀏覽器請(qǐng)求得到一個(gè)由asp.net framework中叫做asp.net routing機(jī)制映射的controller action。asp.net routing被mvc框架用來(lái)為正在到達(dá)的請(qǐng)求選擇一個(gè)路徑指向controller action。
asp.net routing用一個(gè)路由表(route Table)來(lái)提交請(qǐng)求。這個(gè)路由表在程序第一次運(yùn)行的時(shí)候就已經(jīng)產(chǎn)生了。route table在global.asax文件中被定義。默認(rèn)global.asax內(nèi)容如下:
- 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);
- }
- }
- }
當(dāng)程序運(yùn)行時(shí), Application_Start()方法就被調(diào)用,在上面代碼中, Application_Start()方法調(diào)用RegisterRoutes()方法,RegisterRoutes()創(chuàng)建默認(rèn)路由表。
默認(rèn)路由表由一條路由組成。這條路由把一個(gè)正在進(jìn)行的請(qǐng)求分成三個(gè)部分。第一部分的URL被映射到controller,第二部分URL被映射到action,最后一部分用來(lái)給action傳遞參數(shù)id。例如
假設(shè)下面的url:/Product/Details/3
這個(gè)url被分解成三個(gè)部分:controller=product,action=details,id=3
在global.asax文件中定義的默認(rèn)路由包含這三個(gè)參數(shù)的默認(rèn)值。默認(rèn)controller為Home,默認(rèn)action為Index,默認(rèn)id為空。有了上面的知識(shí)做基礎(chǔ),來(lái)分析下面這個(gè)url
/Employee
分解成三部分為controller=employee,action=Index,id=空。
最后,如果我們打開(kāi)一個(gè)mvc應(yīng)用不寫(xiě)任何的路徑(如http://localhost),那么,這個(gè)路徑被解析成下面的三部分
controller=Home,action=Index,id=。
請(qǐng)求被映射到Homecontroller中的Index()action。
學(xué)習(xí)ASP.NET MVC:理解controllers
一個(gè)controller對(duì)一個(gè)用戶(hù)與mvc應(yīng)用交互的方式負(fù)責(zé)。controller包含mvc應(yīng)用的流控制邏輯。controller決定了當(dāng)用戶(hù)請(qǐng)求后返回給用戶(hù)一個(gè)什么內(nèi)容。
controller僅僅是一個(gè)類(lèi)(C#或VB class),這個(gè)mvc簡(jiǎn)單例子包括一個(gè)位于controllers文件夾下的HomeController.cs文件。內(nèi)容如下
- 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();
- }
- }
- }
注意該controller下含有Index和About兩個(gè)方法。這兩個(gè)方法就是controller提供的公共的兩個(gè)action。/Home/Index這個(gè)路徑就會(huì)引用這個(gè)controller中的Index()方法。同理About()也是這樣。
在controller中的任何公共方法都被當(dāng)做一個(gè)controller action。對(duì)此要非常小心。這就意味著在controller下面的任何公共方法都可以被互聯(lián)網(wǎng)上輸入了正確URL的瀏覽器所訪(fǎng)問(wèn)到。
學(xué)習(xí)ASP.NET MVC:理解Views
上面兩個(gè)Action同時(shí)都返回了view,view包含了html標(biāo)記與被送往客戶(hù)瀏覽器的內(nèi)容。在mvc應(yīng)用中,view就相當(dāng)于一個(gè)頁(yè)面。我們必須在合適的位置創(chuàng)建相應(yīng)的view。HomeController.Index() 返回一個(gè)在下列目錄中的view:\Views\Home\Index.aspx,The HomeController.About()則返回\Views\Home\About.aspx。
一般,如果想為一個(gè)controller返回一個(gè)view,你需要在Views目錄下新建子目錄,并以controller同名,在這個(gè)子目錄中,必須建立一個(gè)aspx頁(yè)面,并以controller action同名。
如About.aspx內(nèi)容如下:
- < %@ 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>
如果我們忽略掉第一行,剩下View中的大部分都由標(biāo)準(zhǔn)HTML組成。我們可以修改這個(gè)View用我們想要的HTML代碼。
View與asp和aspx web窗體十分類(lèi)似。可以包括HTML和script內(nèi)容。你可以根據(jù)自己的喜好的.net語(yǔ)言寫(xiě)腳本(c#或VB),通過(guò)這些腳本,我們可以呈現(xiàn)動(dòng)態(tài)數(shù)據(jù),如數(shù)據(jù)庫(kù)數(shù)據(jù)。
學(xué)習(xí)ASP.NET MVC:理解Models
controller和Views都討論完了,最后我們要討論一下最后一個(gè)ASP.NET MVC基本概念:Models。mvc Models是什么呢?
Models包含了在controller和Views中沒(méi)有實(shí)現(xiàn)的所有的應(yīng)用邏輯。Models應(yīng)該包含所有的應(yīng)用業(yè)務(wù)邏輯,認(rèn)證邏輯,數(shù)據(jù)訪(fǎng)問(wèn)邏輯。例如:如果使用了Microsoft Entity Framework 來(lái)實(shí)現(xiàn)數(shù)據(jù)訪(fǎng)問(wèn),就需要在Models文件夾下建立Microsoft Entity Framework類(lèi)的.edmx 文件。
View應(yīng)該只包含與用戶(hù)界面有關(guān)的邏輯。controller應(yīng)該只包含轉(zhuǎn)到正確View或轉(zhuǎn)到其他action的邏輯。其他的東西都應(yīng)該放在Models下面。
一般,我們需要向“胖”Models和“瘦”controllers努力。controller方法應(yīng)該只含有少量的幾行代碼就可以。如果一個(gè)controller很“胖”,你則需要考慮將邏輯移到models文件夾下的一個(gè)新類(lèi)里面。
【編輯推薦】