一、ASP.Net的兩種開發模式
1.1 ASP.Net WebForm的開發模式

(1)處理流程
在傳統的WebForm模式下,我們請求一個例如http://www.aspnetmvc.com/blog/index.aspx的URL,那么我們的WebForm程序會到網站根目錄下去尋找blog目錄下的index.aspx文件,然后由index.aspx頁面的CodeBehind文件(.CS文件)進行邏輯處理,其中或許也包括到數據庫去取出數據(其中的經過怎樣的BLL到DAL這里就不談了),然后再由index.aspx頁面來呈現給用戶。
綜上所述,在WebForm模式下:一個URL請求的是在服務器與該URL對應路徑上的物理文件(ASPX文件或其他),然后由該文件來處理這個請求並返回結果給客戶端。
(2)開發方式
1.2 ASP.Net MVC的開發模式

(1)處理流程
在ASP.Net MVC中,客戶端所請求的URL是被映射到相應的Controller去,然后由Controller來處理業務邏輯,或許要從Model中取數據,然后再由Controller選擇合適的View返回給客戶端。再說回前面我們運行的ASP.NET MVC程序訪問的http://www.aspnetmvc.com/Home/Index這個URL,它訪問的其實是HomeController中的Index這個Action。
(2)顯著特點
二、MVC模式的兩種不同解讀
V:View 是用戶接口層組件。主要是將Model中的數據展示給用戶。aspx和ascx文件被用來處理視圖的職責;
可以看出,對於MVC的兩種不同理解的區別就在於對於Model的理解上:將Model作為業務模型(BLL、DAL等)還是作為視圖模型(ViewModel)。
三、WebForm vs MVC

(1)WebForm
優點: 1.提供了大量的服務器端控件,可以實現快速開發;
2.ViewState回傳數據很方便;
3.學習成本低;
缺點: 1. 封裝太強,雖然學習成本低,很多底層東西讓初學者不是很明白;
2. 自定義控制不靈活,不利於美工和開發人員的配合,往往那些服務器控件處理稍有不慎就會導致出錯;
3. ViewState在頁面中的傳遞會造成大量的流量消耗;
TIP:有關WebForm的服務器控件和ViewState的詳細介紹,不了解的朋友可以閱讀另一篇博文《ASP.Net WebForm學習筆記:aspx與服務器控件探秘》。
(2)MVC
優點: 1.很容易將復雜的應用分成Model(ViewModel)、View、Controller三個組件模型,將處理后台邏輯代碼與前台展示邏輯進行了很好的分離,屬於松耦合關系,在大項目應用中,更易於敏捷開發與測試驅動開發,有很強的可擴展性;
2.因為沒有服務器端控件,所以程序員控制的會更加靈活,頁面更加干凈,沒有ViewState;
3.通過修改路由規則,可以控制生成自定義的url,因此控制生成SEO友好的URL將更加容易;
4.強類型View實現、Razor視圖、Model綁定機制、Model的驗證機制,更安全高效;
缺點: 學習成本高,結構復雜,對未變化數據的不必要的頻繁訪問,也將損害操作性能。
四、第一個ASP.Net MVC程序
4.1 新建項目后的文件組織結構
(1)新建一個ASP.Net MVC 4項目,選擇“基本”配置與“ASPX”視圖引擎(暫時不用Razor引擎)。
(2)VS為我們生成的基本文件組織結構如下圖所示:

可以看出,VS默認幫我們創建好了Models、Views以及Controllers的三個文件夾,這三個文件夾就構成了我們的ASP.Net MVC模式的項目。其中,Controllers是所有控制器的類文件所在,而Models則是所有模型的類文件所在,而Views則是所有cshtml或aspx的文件所在。
4.2 控制器的“約定大於配置”
在Controllers中新建一個控制器,取名為HomeController。在默認的Index這個Action中新建一個視圖,默認名為Index即可。
4.3 視圖的相關約定
4.4 數據傳遞的橋梁-ViewData與ViewBag
PS:ViweBag其實是就一個包含了一層Dynamic的ViewData,兩個兄弟共用的是一個容器。
(5)ViewData與ViewBag的比較
| ViewData | ViewBag |
| 它是Key/Value字典集合 | 它是dynamic類型對像 |
| 從Asp.net MVC 1 就有了 | ASP.NET MVC3 才有 |
| 基於Asp.net 3.5 framework | 基於Asp.net 4.0與.net framework |
| ViewData比ViewBag快 | ViewBag比ViewData慢 |
| 在ViewPage中查詢數據時需要轉換合適的類型 | 在ViewPage中查詢數據時不需要類型轉換 |
| 有一些類型轉換代碼 | 可讀性更好 |
(6)如何在程序中使用ViewData與ViewBag
①在Controller中的代碼
public ActionResult Index()
{
ViewData["Name"] = "Edison Chou";
ViewBag.Name = "Edison Chou";
return View();
}
②在View中的代碼
<body>
<div>
<h1>Hi,ASP.Net MVC First Demo!</h1>
<%
for (int i = 0; i < 5; i++)
{
Response.Write("Hello World!<br/>");
}
%>
<p><%: ViewData["Name"] %></p>
<p><%: ViewBag.Name %></p>
</div>
</body>
4.5 路由機制初步了解
我們通過調試可以知道,在MVC中所有的請求都歸結到控制器下面的Action。所以,所有的請求都是要指定一個具體的Action,Url的格式是根據路由規則來定的。那么,在ASP.Net MVC的路由規則默認又是什么,在哪里設置的呢?
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
打開App_Start文件夾,可以找到RouteConfig這個類,查看RouteConfig這個類的方法,可以知道原來是RegisterRoutes這個方法為我們的ASP.Net MVC項目設置了默認的路由規則:{controller}/{action}/{id},也就是說我們可以通過http://localhost/Home/Index/1這種URL來訪問項目。如果我們想要改變默認的路由規則,例如我們想要以這種URL:http://localhost/Home-Index-1來訪問項目,則直接將上面的默認路由規則改為:{controller}-{action}-{id}即可。

