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