asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

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


发布日期:2021年03月09日
 
ASP.NET MVC 3基础教程之Web Pages
ASPNET MVC 基础教程之Web Pages :用于进行App的初始化时需要进行处理的内容例:向数据库记录系统初始化的一些信息

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动态字段了 }

//

@{

@* ~/Views/_ViewStartcshtml *@

ResponseWrite(stringFormat(<h>{}</h> AppStartMessage));

Layout = ~/Views/Shared/_Layoutcshtml;

}

成员来自:

at SystemWebWebPagesRazorWebPageRazorHost

at SystemWebWebPagesApplicationStartPage

_viewstartcshtml 单个View处理Request时执行

功能:或许你已经联想到了…Global的Page_Load(仅应用于View)……

执行顺序位于_appstartcshtml之后毕竟所除层次不同

成员来自:

at SystemWebMvcRazorViewEngine

综上所述得知MVC的APP初始化顺序为:

(不排除本人未能发现的其他文件类型但目前据我所知道应用最广的就这三个)

在Web Pages 除非你显式以_开头命名View否则你在请求_开头的页面时会遇到以下无法服务的页面提示

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

关于*cshtml生成的类名格式

绝大部分页生成的程序集格式

页面编译都是以单独页面编译为单个带随机字符串的程序集当然也可以采用预编译方式将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

               

上一篇:ASP.NET 用JAMIL组件发布电子邮件

下一篇:ASP.NET MVC如何实现自定义验证