做了8年的asp.net webform,用過MVVM但還沒用過MVC , 雖然項目不用MVC,但是還是想了解一下,今天第二天學習,以下是學習心得。
VS2012默認帶有asp.net mvc3和asp.net mvc4項目模板。
基本URL示例剖析
URL:http://localhost/Account/Login 其中http://localhost/為網站根目錄,Account為Controller名稱,Login為Action名稱。 據此可知 1. 網站中Controllers目錄下應有一名為AccountController的類,其中有一個名為Login的Action成員; 2. 網站中Views目錄下應有一名為Account的目錄,Account目錄下應有一名為Login.cshtml的視圖。 以上這些都是基本的MVC的VC結構,是默認約定的。
ASP.NET MVC ( ASP.NET 引擎,Razor 不是基於ASP.NET的 WebForms 的) 其實是基於ASP.NET Web Forms 機制之上的,在ASP.NET的運行之上加了一層封裝而成的。 System.Web.Mvc.ViewPage繼承自 System.Web.UI.Page,前者是ASP.NET MVC 的頁面呈現類,而后者正是標准的ASP.NET Web Forms 前端頁面類。這也就不奇怪它為什么可以支持 WebForms 的前端綁定語法了,就是本家的語法。
1.首先,在網站根目錄的Web.config中注冊了一個HttpHandler
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
這個就是 MVC 的入口,這個Handler 主要用來處理MVC中的路由,所有的請求都會經過它。
2. Views目錄下的Web.config,其中system.web/pages如下:
<pages validateRequest="false" pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <controls> <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" /> </controls> </pages>
其中繼承重寫了asp.net web forms 中默認頁面的4個基本屬性:
- validateRequest 在asp.net中默認是true, 是指時否驗證回發請求是否被篡改。要使用mvc這個一定要改成false, 否則自驗證無法通過。
- pageParserFilterType 在asp.net中默認是用來獲取解析asp.net默認頁面模型參數的,這里用System.Web.Mvc.ViewTypeParserFilter重寫了默認行為。
- pageBaseType 在asp.net中是指網頁基類,默認為System.Web.UI.Page, 此處重寫為 System.Web.Mvc.ViewPage,此類繼承了System.Web.UI.Page。
- userControlBaseType 在asp.net中是指所有用戶控件的基類,默認為System.Web.UI.UserControl,引處重寫為System.Web.Mvc.ViewUserControl,此類繼承了System.Web.UI.UserControl。
- controls 節點定義了所有以mvc開頭的控件為mvc用戶控件。
3. Views目錄下的Web.config中HttpHandlers有如下定義:
<handlers> <remove name="BlockViewHandler"/> <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> </handlers>
從命名猜測,這個應該是在找不到頁面的時候他會自動處理這個請求。但就這個Handler本身而言他會攔截Views目錄下的所有asp.net請求,默認不包含*.html之類的靜態請求。asp.net默認的動態頁面一般為*.aspx和*.ascx等,為什么cshtml可以被解析為頁面呢?又沒有codebehind源代碼顯式定義, 我想這個原因就在BlockViewHandler中,它負責將cshtml解析為System.Web.Mvc.ViewPage。