asp.net mvc4 學習筆記一(基本原理)


做了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個基本屬性:

  1. validateRequest 在asp.net中默認是true, 是指時否驗證回發請求是否被篡改。要使用mvc這個一定要改成false, 否則自驗證無法通過。
  2. pageParserFilterType 在asp.net中默認是用來獲取解析asp.net默認頁面模型參數的,這里用System.Web.Mvc.ViewTypeParserFilter重寫了默認行為。
  3. pageBaseType 在asp.net中是指網頁基類,默認為System.Web.UI.Page, 此處重寫為 System.Web.Mvc.ViewPage,此類繼承了System.Web.UI.Page。
  4. userControlBaseType 在asp.net中是指所有用戶控件的基類,默認為System.Web.UI.UserControl,引處重寫為System.Web.Mvc.ViewUserControl,此類繼承了System.Web.UI.UserControl。
  5. 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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM