zoukankan      html  css  js  c++  java
  • ASP.NET MVC3 基础教程 – Web Pages 1.0

    image

      I:Web Pages 1.0中以“_”开头的特别文件(文件命名时不区分大小写)

      “_appstart.cshtml” & “_pagestart.cshtml” & “_viewstart.cshtml”

      _appstart.cshtml - 应用程序启动时在Global. Application_Start方法后执行。
      功能:用于进行App的初始化时,需要进行处理的内容,例:向数据库记录系统初始化的一些信息。
      功能与Global.Application_Start类似,差别在于:Global的Start先执行,然后在到该_appStart,值得注意的是在_appStart上下文中可以使用.NET4的dynamic新特性~~在声明中,作为属性、字段、索引器、参数、返回值或类型约束的类型。

    @{
    this.App.StartMessage = "App顺利已启动了.恭喜!哈";
    var error = this.App.Error as string;
    if (error == null)
    {
    this.App.Error = "使用dynamic新特性之前.请先赋值~";
    error = this.App.Error;
    @*
    在这里很遗憾地告诉大家.dynamic不支持智能感知
    因为编译无法100%准确得知程序的执行顺序.
    所以无法智能感知!
    *@
    }
    // 在这里可以引用 App.Error动态字段了.
    }

    image

    @{
    @* ~/Views/_ViewStart.cshtml *@
    Response.Write(string.Format("
    <h1>{0}</h1>", App.StartMessage));
    Layout = "~/Views/Shared/_Layout.cshtml";
    }

    image  成员来自:

      at System.Web.WebPages.Razor.WebPageRazorHost

      at System.Web.WebPages.ApplicationStartPage

      _viewstart.cshtml - 单个View处理Request时执行。
      功能:或许你已经联想到了….Global的Page_Load(仅应用于View)……
      执行顺序位于_appstart.cshtml之后.毕竟所除层次不同。
      成员来自: 

      at System.Web.Mvc.RazorViewEngine
      综上所述得知MVC3的APP初始化顺序为:
    image   (不排除本人未能发现的其他文件类型,但目前据我所知道应用最广的就这三个)
      在Web Pages 1.0下,除非你显式以”_”开头命名View.否则你在请求”_”开头的页面时会遇到以下无法服务的页面提示:
    image

      (这图在Razor语法基础时就帖过了.这里帖出来是让大家温故而知新)

      关于*.cshtml生成的类名格式,绝大部分页生成的程序集格式。
    image   页面编译都是以单独页面编译为单个带随机字符串的程序集,当然也可以采用预编译方式将n个页编译为1个程序集。

      II:关于多目录下以”_”开头的特殊文件的执行顺序

      _appstart.cshtml仅能存在于根目录(“~/”),如果你在子目录下放置_appstart.cshtml文件的话.那么该文件就不会被App初始化时执行。
      当访问~/somepage.cshtml时:

      会先执行~/_pageStart.cshtml

      然后在执行 ~/somepage.cshtml
      当在复杂的子目录环境下时:

      ~/_pageStart.cshtml

            ~/sub/_pageStart.cshtml

            ~/sub/somepage.cshtml

      III:Web Pages 1.0脱离WebForms的启动原理

      首先Web Pages利用特性往本身程序集上与ASP.NET挂钩:

    // SourceFile: AssemblyInfo.cs(System.Web.WebPages.dll)
    //AttributeClass: System.Web. PreApplicationStartMethodAttribute
    //特性介绍:为ASP.NET 其他Provide提供扩展
    //参数1: ASP.NET Provide的类型
    //参数2:运行的方法名
    //Source:
    [assembly: PreApplicationStartMethod(typeof(System.Web.WebPages.PreApplicationStartCode), "Start")] //Line: 15

      然后我们在这里可以看到Web Pages的ASP.NET Provide是.Web.WebPages.PreApplicationStartCode。
      启动方法是Start:

    public static void Start() {
    // Even though ASP.NET will only call each PreAppStart once, we sometimes internally call one
    // another PreAppStart to ensure that things get initialized in the right order. ASP.NET 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方法已被调用 

    WebPageHttpHandler.RegisterExtension(
    "cshtml");//注册扩展 
    WebPageHttpHandler.RegisterExtension(
    "vbhtml");//注册扩展

    // Turn off the string resource behavior which would not work in our simple base page 
    PageParser.EnableLongStringsAsResources
    = false;//优化选项 

    DynamicModuleUtility.RegisterModule(
    typeof(WebPageHttpModule));//重点在这里了.~~注册了一个WebPageHttpModule 

    ScopeStorage.CurrentProvider
    = new AspNetRequestScopeStorageProvider();
    //ASP.NET 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
    }

      V:有经验的看官,或许已经知道了,可以在*.cshtml中做IoC(Unity 2.0有提供)来变Themes换布局等。

      更深入点,你可以dynamic创建*.cshtml文件~~实现按需创建Web页~HOHO~~~

      @* MVC3一个新的Web开发革命正式诞生 *@

  • 相关阅读:
    sfs2x 连接 mongodb
    java websocket
    webstorm 4.0 注册码
    解决 sfs2 admin tool 找不到扩展
    window 注册表五大类
    opengl 学习第二日
    java google Protobuf
    扩展 java sencha touch PhonegapPlugin
    sencha touch2 kryonet socket phonegap 通信 作者:围城
    sencha touch2 layout 笔记
  • 原文地址:https://www.cnblogs.com/luluping/p/2035333.html
Copyright © 2011-2022 走看看