熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET MVC 3基礎教程之Web Pages

2013-11-13 09:48:01  來源: .NET編程 
ASPNET MVC 基礎教程之Web Pages :用於進行App的初始化時需要進行處理的內容例:向數據庫記錄系統初始化的一些信息

  

  image

  I:Web Pages 中以_開頭的特別文件(文件命名時不區分大小寫)

  _appstartcshtml & _pagestartcshtml & _viewstartcshtml

  _appstartcshtml 應用程序啟動時在Global Application_Start方法後執行

  功能:用於進行App的初始化時需要進行處理的內容例:向數據庫記錄系統初始化的一些信息

  功能與GlobalApplication_Start類似差別在於:Global的Start先執行然後在到該_appStart值得注意的是在_appStart上下文中可以使用NET的dynamic新特性~~在聲明中作為屬性字段索引器參數返回值或類型約束的類型

  cn/library/ddaspx

  @{
    thisAppStartMessage = App順利已啟動了恭喜!哈;
    var error = thisAppError as string;
    if (error == null)
    {
    thisAppError = 使用dynamic新特性之前請先賦值~;
    error = thisAppError;
    @*
    在這裡很遺憾地告訴大家dynamic不支持智能感知
    因為編譯無法%准確得知程序的執行順序
    所以無法智能感知!
    *@
    }
    // 在這裡可以引用 AppError動態字段了  }

  image

  //
    @{
    @* ~/Views/_ViewStartcshtml *@
    ResponseWrite(stringFormat(<h>{}</h> AppStartMessage));
    Layout = ~/Views/Shared/_Layoutcshtml;
    } 

  image 

  成員來自:

  at SystemWebWebPagesRazorWebPageRazorHost

  at SystemWebWebPagesApplicationStartPage

  _viewstartcshtml 單個View處理Request時執行

  功能:或許你已經聯想到了…Global的Page_Load(僅應用於View)……

  執行順序位於_appstartcshtml之後畢竟所除層次不同

  成員來自:

  at SystemWebMvcRazorViewEngine

綜上所述得知MVC的APP初始化順序為:

  image 

  (不排除本人未能發現的其他文件類型但目前據我所知道應用最廣的就這三個)

  在Web Pages 除非你顯式以_開頭命名View否則你在請求_開頭的頁面時會遇到以下無法服務的頁面提示

  image

  (這圖在Razor語法基礎時就帖過了這裡帖出來是讓大家溫故而知新)

  關於*cshtml生成的類名格式

  絕大部分頁生成的程序集格式

  image 

  頁面編譯都是以單獨頁面編譯為單個帶隨機字符串的程序集當然也可以采用預編譯方式將n個頁編譯為個程序集

  II:關於多目錄下以_開頭的特殊文件的執行順序

  _appstartcshtml僅能存在於根目錄(~/)

  如果你在子目錄下放置_appstartcshtml文件的話那麼該文件就不會被App初始化時執行

  當訪問~/somepagecshtml時

  會先執行~/_pageStartcshtml

  然後在執行 ~/somepagecshtml

  當在復雜的子目錄環境下時:

  ~/_pageStartcshtml

  ~/sub/_pageStartcshtml

  ~/sub/somepagecshtml

  III:Web Pages 脫離WebForms的啟動原理

  首先Web Pages利用特性往本身程序集上與ASPNET掛鉤

  // SourceFile: AssemblyInfocs(SystemWebWebPagesdll)
    //AttributeClass: SystemWeb PreApplicationStartMethodAttribute
    //特性介紹:為ASPNET 其他Provide提供擴展  //參數: ASPNET Provide的類型
    //參數:運行的方法名  //Source:  [assembly: PreApplicationStartMethod(typeof(SystemWebWebPagesPreApplicationStartCode) Start)]
    //Line: 然後我們在這裡可以看到Web Pages的ASPNET Provide是WebWebPagesPreApplicationStartCode
    啟動方法是Start
    public static void Start() {
    // Even though ASPNET will only call each PreAppStart once we sometimes internally call one
    // another PreAppStart to ensure that things get initialized in the right order ASPNET does
    // order so we have to guard against multiple calls
    // All Start calls are made on same thread so no lock needed here
    if (_startWasCalled) {
    return;
    }
    _startWasCalled = true; //設置Start方法已被調用
    WebPageHttpHandlerRegisterExtension(cshtml);//注冊擴展
    WebPageHttpHandlerRegisterExtension(vbhtml);//注冊擴展
    // Turn off the string resource behavior which would not work in our simple base page
    PageParserEnableLongStringsAsResources = false;//優化選項
    DynamicModuleUtilityRegisterModule(typeof(WebPageHttpModule));//重點在這裡了~~注冊了一個WebPageHttpModule         ScopeStorageCurrentProvider = new AspNetRequestScopeStorageProvider();
    //ASPNET Web Pages的RequestScopeStorageProvider  } IV:附錄:Global執行順序
    當WebApp開始運行時
    Application_Start
    Application_BeginRequest
    Application_AuthenticateRequest
    Session_Start
    當WebApp終止運行時
    Session_End
    Application_End
    當一個Request入站時
    Application_BeginRequest
    Application_AuthenticateRequest 過後到達*cshtml
    當在*cshtml throw new Exception();時
    Application_BeginRequest
    Application_AuthenticateRequest
    Application_Error(在throw處轉至不會執行*cshtml的throw後的下文)
    例:  @{  Throw new Exception();//僅做示例
    //下文不會被執行而直接跳到Application_Error終止Response
    }
    原文鏈接l


From:http://tw.wingwit.com/Article/program/net/201311/11621.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.