ASP.Net Web Form<一> aspx文件编译及呈现
对比复习下JSP
1、jsp的本质是Servlet ,会在第一次被访问时会被翻译成一个类文件,从此对这个页面的访问都是由这个类文件执行后进行输出。
aspx 本质是IHttpHandler
2、jsp模版元素: 页面中书写的Html内容,直接被响应输出到浏览器上。
3、jsp表达式 : <%= 表达式%> , 计算出表达式的值后,直接被响应输出到浏览器。
4、jsp脚本片段: <% 若干语句%>, 在翻译过来的类中,直接被复制黏贴到对应的位置执行。
5、jsp声明 : <%! 若干java语句%> 在翻译过来的Servlet中会被放置到和Service方法同级的位置,成为类的一个成员。
aspx 中 使用 <script runat='server'></script>或者code-behind(双文件ASP.net页面)实现。
6、jsp注解:
<%--注解的内容--%> 被jsp注解注释掉的内容,在jsp翻译引擎将JSP翻译成Servlet的过程中会被丢弃,在翻译过来的Servlet中没有这些信息。
<%//Java注释 %> 属于脚本片段,将被复制到Servlet中,在 .java文件被翻译成 .class 文件时被丢弃。
<!-- html 注解 --> 被当做模板元素,输出到浏览器上。
7、jsp指令:<%@ 指令名称 属性=。。。%>, 为jsp引擎而设计,并不直接产生任何可见输出,而只是告诉引擎如何处理jsp页面中的其余部分。
ASP.Net Web Form
<%@ Page Language="C#" %> 单页面形式(仅页面呈现文件 xxx.aspx)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>
website项目中的 双页面形式(页面呈现文件 xxx.aspx, 代码隐藏文件 xxx.aspx.cs)
或 web application项目中 三页面形式(xxx.aspx,xxx.aspx.cs,xxx.aspx.designer.cs)
视图状态
http是无状态协议,asp.net通过__VIEWSTATE 这个隐藏域在多次页面请求直接为asp控件保存状态值。默认情况下ASP.NET中得每个控件都启用了试图状态,所有控件的属性值都保存在这一隐藏域中,每个控件都有个EnableViewState属性,可以禁用该控件的视图状态,也可以用指令禁用页面中的视图状态,或者在web.config中禁用整站的视图状态。
除了视图状态外,.net2.0 另增加了控件状态(Control State)用于保存控件的临界状态值,如GridView使用它保存被选中行的信息,即便视图状态被禁,依然可以记得哪一行被选中。
动态编译
当请求一个asp.net页面时,asp.net framework会检测这个页面对应的.net类,不存在则自动把这个页面编译为一个新类(程序集),保存在\windows\Microsoft.Net\Framework\v2.0.50727\Temporary ASP.NET Files。此后任何对该页面的修改,对应的.net类都会被自动删除,下次请求时再重新编译。与asp页面不同的是,asp.net页面不会在每次被请求时都进行解析和编译。
可以使用aspnet_compiler.exe预编译整个asp.net应用程序,可以避免用户第一次请求页面时的编译延时。
通过CompilationMode属性可以禁用单个页面,一个文件夹下的页面乃至整站的动态编译。当网站有数千个页面,又不愿为每个页面向内存中加载程序集时,禁用编译就很有用处。CompilationMode=Never,页面仅在运行时被解释。其中包含服务端代码(<script runat='server'></script>代码块)的页面不能禁止编译。
双文件Asp.net页面的编译
双文件Asp.net页面的两个部分是部分类和继承关系的联合,部分类的技术是.net2.0后才出现的,在.net1.x中,双文件Asp.net页面的编译生成两个类,分别对应代码隐藏文件和页面呈现文件,二者通过类继承联系在一起。继承是一种单向关系,所有在呈现文件中声明的文件,在父类(代码隐藏文件)中也必需声明,且ID必需一致。否则继承关系将被打断,控件引发的事件将不会被代码隐藏文件处理。
而在2.0后,为了兼容之前的1.x版本,实际编译生成的是3个类。
1. 一个类对应代码隐藏文件(一个部分类,内容与原xxx.aspx.cs文件一致)。
2. 一个类中包含控件声明,内容类似xxx.aspx.designer.cs文件,同样也是部分类。负责将在子类(xxx.aspx文件)中声明的runat='server'的服务器控件自动在父类中注册一个同名的成员。
public partial class mtdl_Admin_Business : System.Web.SessionState.IRequiresSessionState { protected global::ASP.mtdl_mt_title_ascx mt_title; protected global::ASP.mtdl_mt_left_ascx mt_left; protected global::System.Web.UI.WebControls.LinkButton LinkButton_FB; protected global::System.Web.UI.WebControls.LinkButton LinkButton_CX; protected global::System.Web.UI.WebControls.Repeater Repeater1; protected global::System.Web.UI.HtmlControls.HtmlForm form1; protected global::ASP.mtdl_mt_bottom_ascx mt_bottom; protected System.Web.Profile.DefaultProfile Profile { get { return ((System.Web.Profile.DefaultProfile)(this.Context.Profile)); } } protected ASP.global_asax ApplicationInstance { get { return ((ASP.global_asax)(this.Context.ApplicationInstance)); } } }
2. 最后一个类则由xxx.aspx文件转换而来的子类
namespace ASP { [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()] public class mtdl_tem_sys_admin_business_aspx : global::mtdl_Admin_Business, System.Web.IHttpHandler { private static bool @__initialized; private static object @__stringResource; private static object @__fileDependencies; [System.Diagnostics.DebuggerNonUserCodeAttribute()] public mtdl_tem_sys_admin_business_aspx() { string[] dependencies; ((global::System.Web.UI.Page)(this)).AppRelativeVirtualPath = "~/mtdl/tem_sys/Admin_Business.aspx"; if ((global::ASP.mtdl_tem_sys_admin_business_aspx.@__initialized == false)) { global::ASP.mtdl_tem_sys_admin_business_aspx.@__stringResource = this.ReadStringResource(); dependencies = new string[10]; dependencies[0] = "~/mtdl/mt_title.ascx.cs"; dependencies[1] = "~/mtdl/mt_title.ascx"; dependencies[2] = "~/mtdl/tem_sys/Admin_Business.aspx.cs"; dependencies[3] = "~/mtdl/mt_iframe_path.ascx.cs"; dependencies[4] = "~/mtdl/mt_iframe_path.ascx"; dependencies[5] = "~/mtdl/mt_bottom.ascx"; dependencies[6] = "~/mtdl/mt_left.ascx"; dependencies[7] = "~/mtdl/mt_bottom.ascx.cs"; dependencies[8] = "~/mtdl/tem_sys/Admin_Business.aspx"; dependencies[9] = "~/mtdl/mt_left.ascx.cs"; global::ASP.mtdl_tem_sys_admin_business_aspx.@__fileDependencies = this.GetWrappedFileDependencies(dependencies); global::ASP.mtdl_tem_sys_admin_business_aspx.@__initialized = true; } this.Server.ScriptTimeout = 30000000; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::ASP.mtdl_mt_title_ascx @__BuildControlmt_title() { global::ASP.mtdl_mt_title_ascx @__ctrl; @__ctrl = new global::ASP.mtdl_mt_title_ascx(); this.mt_title = @__ctrl; @__ctrl.InitializeAsUserControl(this.Page); @__ctrl.ID = "mt_title"; return @__ctrl; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::ASP.mtdl_mt_left_ascx @__BuildControlmt_left() { global::ASP.mtdl_mt_left_ascx @__ctrl; @__ctrl = new global::ASP.mtdl_mt_left_ascx(); this.mt_left = @__ctrl; @__ctrl.InitializeAsUserControl(this.Page); @__ctrl.ID = "mt_left"; return @__ctrl; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.WebControls.LinkButton @__BuildControlLinkButton_FB() { global::System.Web.UI.WebControls.LinkButton @__ctrl; @__ctrl = new global::System.Web.UI.WebControls.LinkButton(); this.LinkButton_FB = @__ctrl; @__ctrl.ApplyStyleSheetSkin(this); @__ctrl.ID = "LinkButton_FB"; ((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("class", "f"); System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl)); @__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("发布")); @__ctrl.Click += new System.EventHandler(this.LinkButton_FB_Click); return @__ctrl; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.WebControls.LinkButton @__BuildControlLinkButton_CX() { global::System.Web.UI.WebControls.LinkButton @__ctrl; @__ctrl = new global::System.Web.UI.WebControls.LinkButton(); this.LinkButton_CX = @__ctrl; @__ctrl.ApplyStyleSheetSkin(this); @__ctrl.ID = "LinkButton_CX"; ((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("class", "c"); System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl)); @__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("撤销发布")); @__ctrl.Click += new System.EventHandler(this.LinkButton_CX_Click); return @__ctrl; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.WebControls.CheckBox @__BuildControl__control3() { global::System.Web.UI.WebControls.CheckBox @__ctrl; @__ctrl = new global::System.Web.UI.WebControls.CheckBox(); @__ctrl.TemplateControl = this; @__ctrl.ApplyStyleSheetSkin(this); @__ctrl.ID = "chkItem"; return @__ctrl; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.WebControls.HiddenField @__BuildControl__control4() { global::System.Web.UI.WebControls.HiddenField @__ctrl; @__ctrl = new global::System.Web.UI.WebControls.HiddenField(); @__ctrl.TemplateControl = this; @__ctrl.ID = "infosid"; @__ctrl.DataBinding += new System.EventHandler(this.@__DataBinding__control4); return @__ctrl; } public void @__DataBinding__control4(object sender, System.EventArgs e) { System.Web.UI.WebControls.HiddenField dataBindingExpressionBuilderTarget; System.Web.UI.WebControls.RepeaterItem Container; dataBindingExpressionBuilderTarget = ((System.Web.UI.WebControls.HiddenField)(sender)); Container = ((System.Web.UI.WebControls.RepeaterItem)(dataBindingExpressionBuilderTarget.BindingContainer)); dataBindingExpressionBuilderTarget.Value = global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.DataBoundLiteralControl @__BuildControl__control5() { global::System.Web.UI.DataBoundLiteralControl @__ctrl; @__ctrl = new global::System.Web.UI.DataBoundLiteralControl(6, 5); @__ctrl.TemplateControl = this; @__ctrl.SetStaticString(0, "\r\n </td>\r\n " + " <td><a style=\"color:#12619D;\" hr" + "ef=\"javascript:openDetail(\'"); @__ctrl.SetStaticString(1, "\')\"> "); @__ctrl.SetStaticString(2, "</a></td>\r\n <td> " + ""); @__ctrl.SetStaticString(3, "</td>\r\n <td align=\"cen" + "ter\"><a style=\"color:#12619D;\" href=\"Admin_Func.aspx?glid="); @__ctrl.SetStaticString(4, "\">查看("); @__ctrl.SetStaticString(5, ")</a></td>\r\n <td> " + ";"); @__ctrl.DataBinding += new System.EventHandler(this.@__DataBind__control5); return @__ctrl; } public void @__DataBind__control5(object sender, System.EventArgs e) { System.Web.UI.WebControls.RepeaterItem Container; System.Web.UI.DataBoundLiteralControl target; target = ((System.Web.UI.DataBoundLiteralControl)(sender)); Container = ((System.Web.UI.WebControls.RepeaterItem)(target.BindingContainer)); target.SetDataBoundString(0, global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture)); target.SetDataBoundString(1, global::System.Convert.ToString(Eval("annotation"), global::System.Globalization.CultureInfo.CurrentCulture)); target.SetDataBoundString(2, global::System.Convert.ToString(Eval("name"), global::System.Globalization.CultureInfo.CurrentCulture)); target.SetDataBoundString(3, global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture)); target.SetDataBoundString(4, global::System.Convert.ToString(Eval("num"), global::System.Globalization.CultureInfo.CurrentCulture)); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.DataBoundLiteralControl @__BuildControl__control6() { global::System.Web.UI.DataBoundLiteralControl @__ctrl; @__ctrl = new global::System.Web.UI.DataBoundLiteralControl(4, 3); @__ctrl.TemplateControl = this; @__ctrl.SetStaticString(0, "</td>\r\n <td align=\"cen" + "ter\"><img src=\'"); @__ctrl.SetStaticString(1, "\' /></td>\r\n <td align=" + "\"center\">"); @__ctrl.SetStaticString(2, "</td>\r\n <td> "); @__ctrl.SetStaticString(3, "</td>\r\n <td align=\"cen" + "ter\" >\r\n "); @__ctrl.DataBinding += new System.EventHandler(this.@__DataBind__control6); return @__ctrl; } public void @__DataBind__control6(object sender, System.EventArgs e) { System.Web.UI.WebControls.RepeaterItem Container; System.Web.UI.DataBoundLiteralControl target; target = ((System.Web.UI.DataBoundLiteralControl)(sender)); Container = ((System.Web.UI.WebControls.RepeaterItem)(target.BindingContainer)); target.SetDataBoundString(0, global::System.Convert.ToString((Eval("n_is_active") + "" == "1" ? "../images/d.gif" : "../images/c.gif"), global::System.Globalization.CultureInfo.CurrentCulture)); target.SetDataBoundString(1, global::System.Convert.ToString(Eval("d_mode_date", "{0:d}"), global::System.Globalization.CultureInfo.CurrentCulture)); target.SetDataBoundString(2, global::System.Convert.ToString(Eval("c_editer"), global::System.Globalization.CultureInfo.CurrentCulture)); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.WebControls.LinkButton @__BuildControl__control7() { global::System.Web.UI.WebControls.LinkButton @__ctrl; @__ctrl = new global::System.Web.UI.WebControls.LinkButton(); @__ctrl.TemplateControl = this; @__ctrl.ApplyStyleSheetSkin(this); ((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("style", "color:red;"); @__ctrl.OnClientClick = "return confirm(\'确认删除吗?删除后不可恢复!\');"; @__ctrl.CausesValidation = false; System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl)); @__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("删除")); @__ctrl.DataBinding += new System.EventHandler(this.@__DataBinding__control7); @__ctrl.Click += new System.EventHandler(this.btnDel_Click); return @__ctrl; } public void @__DataBinding__control7(object sender, System.EventArgs e) { System.Web.UI.WebControls.LinkButton dataBindingExpressionBuilderTarget; System.Web.UI.WebControls.RepeaterItem Container; dataBindingExpressionBuilderTarget = ((System.Web.UI.WebControls.LinkButton)(sender)); Container = ((System.Web.UI.WebControls.RepeaterItem)(dataBindingExpressionBuilderTarget.BindingContainer)); dataBindingExpressionBuilderTarget.CommandName = global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture); dataBindingExpressionBuilderTarget.Visible = ((bool)(GetCanDelete(Eval("num")))); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.WebControls.LinkButton @__BuildControl__control8() { global::System.Web.UI.WebControls.LinkButton @__ctrl; @__ctrl = new global::System.Web.UI.WebControls.LinkButton(); @__ctrl.TemplateControl = this; @__ctrl.ApplyStyleSheetSkin(this); @__ctrl.ID = "LiButton1"; System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl)); @__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("<img src=\"../images/s.gif\" alt=\"↑\"/>")); @__ctrl.DataBinding += new System.EventHandler(this.@__DataBinding__control8); @__ctrl.Click += new System.EventHandler(this.Sort_Click); return @__ctrl; } public void @__DataBinding__control8(object sender, System.EventArgs e) { System.Web.UI.WebControls.LinkButton dataBindingExpressionBuilderTarget; System.Web.UI.WebControls.RepeaterItem Container; dataBindingExpressionBuilderTarget = ((System.Web.UI.WebControls.LinkButton)(sender)); Container = ((System.Web.UI.WebControls.RepeaterItem)(dataBindingExpressionBuilderTarget.BindingContainer)); dataBindingExpressionBuilderTarget.CommandName = global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.WebControls.LinkButton @__BuildControl__control9() { global::System.Web.UI.WebControls.LinkButton @__ctrl; @__ctrl = new global::System.Web.UI.WebControls.LinkButton(); @__ctrl.TemplateControl = this; @__ctrl.ApplyStyleSheetSkin(this); @__ctrl.ID = "LinkButton2"; System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl)); @__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("<img src=\"../images/x.gif\" alt=\"↓\"/>")); @__ctrl.DataBinding += new System.EventHandler(this.@__DataBinding__control9); @__ctrl.Click += new System.EventHandler(this.Sort_Click); return @__ctrl; } public void @__DataBinding__control9(object sender, System.EventArgs e) { System.Web.UI.WebControls.LinkButton dataBindingExpressionBuilderTarget; System.Web.UI.WebControls.RepeaterItem Container; dataBindingExpressionBuilderTarget = ((System.Web.UI.WebControls.LinkButton)(sender)); Container = ((System.Web.UI.WebControls.RepeaterItem)(dataBindingExpressionBuilderTarget.BindingContainer)); dataBindingExpressionBuilderTarget.CommandName = global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private void @__BuildControl__control2(System.Web.UI.Control @__ctrl) { global::System.Web.UI.WebControls.CheckBox @__ctrl1; @__ctrl1 = this.@__BuildControl__control3(); System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl)); @__parser.AddParsedSubObject(@__ctrl1); global::System.Web.UI.WebControls.HiddenField @__ctrl2; @__ctrl2 = this.@__BuildControl__control4(); @__parser.AddParsedSubObject(@__ctrl2); global::System.Web.UI.DataBoundLiteralControl @__ctrl3; @__ctrl3 = this.@__BuildControl__control5(); @__parser.AddParsedSubObject(@__ctrl3); global::System.Web.UI.DataBoundLiteralControl @__ctrl4; @__ctrl4 = this.@__BuildControl__control6(); @__parser.AddParsedSubObject(@__ctrl4); global::System.Web.UI.WebControls.LinkButton @__ctrl5; @__ctrl5 = this.@__BuildControl__control7(); @__parser.AddParsedSubObject(@__ctrl5); global::System.Web.UI.WebControls.LinkButton @__ctrl6; @__ctrl6 = this.@__BuildControl__control8(); @__parser.AddParsedSubObject(@__ctrl6); global::System.Web.UI.WebControls.LinkButton @__ctrl7; @__ctrl7 = this.@__BuildControl__control9(); @__parser.AddParsedSubObject(@__ctrl7); @__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.@__Render__control2)); } private void @__Render__control2(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer) { this.WriteUTF8ResourceString(@__w, 9226, 390, true); parameterContainer.Controls[0].RenderControl(@__w); @__w.Write("\r\n "); parameterContainer.Controls[1].RenderControl(@__w); parameterContainer.Controls[2].RenderControl(@__w); @__w.Write(GetPlatform()); parameterContainer.Controls[3].RenderControl(@__w); parameterContainer.Controls[4].RenderControl(@__w); @__w.Write("\r\n </td>\r\n " + " <td>\r\n " + " "); parameterContainer.Controls[5].RenderControl(@__w); @__w.Write("\r\n "); parameterContainer.Controls[6].RenderControl(@__w); @__w.Write("\r\n </td>\r\n " + " </tr>\r\n " + " "); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.WebControls.Repeater @__BuildControlRepeater1() { global::System.Web.UI.WebControls.Repeater @__ctrl; @__ctrl = new global::System.Web.UI.WebControls.Repeater(); this.Repeater1 = @__ctrl; @__ctrl.ItemTemplate = new System.Web.UI.CompiledTemplateBuilder(new System.Web.UI.BuildTemplateMethod(this.@__BuildControl__control2)); @__ctrl.ID = "Repeater1"; return @__ctrl; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::System.Web.UI.HtmlControls.HtmlForm @__BuildControlform1() { global::System.Web.UI.HtmlControls.HtmlForm @__ctrl; @__ctrl = new global::System.Web.UI.HtmlControls.HtmlForm(); this.form1 = @__ctrl; @__ctrl.ID = "form1"; global::System.Web.UI.WebControls.LinkButton @__ctrl1; @__ctrl1 = this.@__BuildControlLinkButton_FB(); System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl)); @__parser.AddParsedSubObject(@__ctrl1); global::System.Web.UI.WebControls.LinkButton @__ctrl2; @__ctrl2 = this.@__BuildControlLinkButton_CX(); @__parser.AddParsedSubObject(@__ctrl2); global::System.Web.UI.WebControls.Repeater @__ctrl3; @__ctrl3 = this.@__BuildControlRepeater1(); @__parser.AddParsedSubObject(@__ctrl3); @__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.@__Renderform1)); return @__ctrl; } private void @__Renderform1(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer) { this.WriteUTF8ResourceString(@__w, 9616, 852, false); parameterContainer.Controls[0].RenderControl(@__w); @__w.Write("</li>\r\n <li>"); parameterContainer.Controls[1].RenderControl(@__w); this.WriteUTF8ResourceString(@__w, 10468, 2885, false); parameterContainer.Controls[2].RenderControl(@__w); @__w.Write("\r\n </table>\r\n\r\n " + " </div>\r\n\r\n "); if (pagecount > 0) { @__w.Write("\r\n <div class=\"fy\">\r\n " + " <div class=\"fyn\">\r\n " + " <ul>\r\n "); @__w.Write(pagoutstr); @__w.Write("\r\n </ul>\r\n " + " </div>\r\n </div>\r\n " + " "); } @__w.Write("\r\n </td>\r\n </tr" + ">\r\n </table>\r\n </td>\r\n " + " </tr>\r\n </tbody>\r\n </table>\r\n "); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private global::ASP.mtdl_mt_bottom_ascx @__BuildControlmt_bottom() { global::ASP.mtdl_mt_bottom_ascx @__ctrl; @__ctrl = new global::ASP.mtdl_mt_bottom_ascx(); this.mt_bottom = @__ctrl; @__ctrl.InitializeAsUserControl(this.Page); @__ctrl.ID = "mt_bottom"; return @__ctrl; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] private void @__BuildControlTree(mtdl_tem_sys_admin_business_aspx @__ctrl) { @__ctrl.EnableViewStateMac = false; this.InitializeCulture(); global::ASP.mtdl_mt_title_ascx @__ctrl1; @__ctrl1 = this.@__BuildControlmt_title(); System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl)); @__parser.AddParsedSubObject(@__ctrl1); global::ASP.mtdl_mt_left_ascx @__ctrl2; @__ctrl2 = this.@__BuildControlmt_left(); @__parser.AddParsedSubObject(@__ctrl2); global::System.Web.UI.HtmlControls.HtmlForm @__ctrl3; @__ctrl3 = this.@__BuildControlform1(); @__parser.AddParsedSubObject(@__ctrl3); global::ASP.mtdl_mt_bottom_ascx @__ctrl4; @__ctrl4 = this.@__BuildControlmt_bottom(); @__parser.AddParsedSubObject(@__ctrl4); @__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.@__Render__control1)); } private void @__Render__control1(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer) { this.WriteUTF8ResourceString(@__w, 13353, 875, false); @__w.Write(glid); this.WriteUTF8ResourceString(@__w, 14228, 463, false); parameterContainer.Controls[0].RenderControl(@__w); @__w.Write("\r\n "); parameterContainer.Controls[1].RenderControl(@__w); @__w.Write("\r\n <div id=\"mtcontainer\" class=\"container_scroll\">\r\n "); parameterContainer.Controls[2].RenderControl(@__w); @__w.Write("\r\n </div>\r\n "); parameterContainer.Controls[3].RenderControl(@__w); @__w.Write("\r\n</body>\r\n</html>"); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] protected override void FrameworkInitialize() { base.FrameworkInitialize(); this.SetStringResourcePointer(global::ASP.mtdl_tem_sys_admin_business_aspx.@__stringResource, 0); this.@__BuildControlTree(this); this.AddWrappedFileDependencies(global::ASP.mtdl_tem_sys_admin_business_aspx.@__fileDependencies); this.Request.ValidateInput(); } [System.Diagnostics.DebuggerNonUserCodeAttribute()] public override int GetTypeHashCode() { return -1338025651; } [System.Diagnostics.DebuggerNonUserCodeAttribute()] public override void ProcessRequest(System.Web.HttpContext context) { base.ProcessRequest(context); } } }
eg:
若干页面一组,会被编译为一个dll,并自动匹配了一个简单工厂
//------------------------------------------------------------------------------ // <auto-generated> // 此代码由工具生成。 // 运行时版本:4.0.30319.17929 // // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // </auto-generated> //------------------------------------------------------------------------------ [assembly: System.CodeDom.Compiler.GeneratedCodeAttribute("ASP.NET", "4.0.30319.17929")] [assembly: System.Security.SecurityRulesAttribute(System.Security.SecurityRuleSet.Level2)] [assembly: System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0")] namespace @__ASP { internal class FastObjectFactory_app_web_1x3iilvw { #line 1 "c:\\dummy.txt" #line default #line hidden private FastObjectFactory_app_web_1x3iilvw() { } static object Create_ASP_mtdl_tem_sys_admin_business_add_aspx() { return new ASP.mtdl_tem_sys_admin_business_add_aspx(); } static object Create_ASP_mtdl_tem_sys_managerlevel_aspx() { return new ASP.mtdl_tem_sys_managerlevel_aspx(); } static object Create_ASP_mtdl_tem_sys_admin_role_aspx() { return new ASP.mtdl_tem_sys_admin_role_aspx(); } static object Create_ASP_mtdl_tem_sys_admin_config_aspx() { return new ASP.mtdl_tem_sys_admin_config_aspx(); } static object Create_ASP_mtdl_tem_sys_admin_business_aspx() { return new ASP.mtdl_tem_sys_admin_business_aspx(); } } }
也包括App_Code文件夹下的类(App_Code没有匹配实例化工厂), global.asax文件也是一样的处理方式
控件树
生成的类继承自System.Web.UI.Page,asp.net framework 调用 void ProcessRequest(System.Web.HttpContext context)方法显示页面,这个方法构建页面的控件树。
控件树的根节点是Page本身,asp.net页面中的所有元素都会被转换到.net类中,其中html和纯文本用LiteralControl呈现,可以用FindControl(ID)查找控件。
页面执行生命周期
public partial class Default2 : System.Web.UI.Page { protected int i = 1; protected void Page_PreInit(object sender, EventArgs e) { Response.Write(i + ".PreInit:当页面初始化开始时发生"); i++; Response.Write("<br>"); } protected void Page_Init(object sender, EventArgs e) { Response.Write(i + ".Init:当页面初始化时发生"); i++; Response.Write("<br>"); } protected void Page_InitComplete(object sender, EventArgs e) { Response.Write(i + ".InitComplete:当页初始化完成时发生"); i++; Response.Write("<br>"); } protected void Page_PreLoad(object sender, EventArgs e) { Response.Write(i + ".PreLoad:当页load事件前发生"); i++; Response.Write("<br>"); } protected void Page_Load(object sender, EventArgs e) { Response.Write(i + ".Load:当服务器控件加载到Page对象中时发生(加载页面时)"); i++; Response.Write("<br>"); //在Load和LoadComplete之间会执行控件事件. //如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。 } protected void Page_LoadComplete(object sender, EventArgs e) { Response.Write(i + ".LoadComplete:当页面生命周期的加载阶段结束时发生"); i++; Response.Write("<br>"); } protected void Page_PreRender(object sender, EventArgs e) { Response.Write(i + ".PreRender:当页加载控件之后,呈现之前发生,使用该事件对页或其控件的内容进行最后更改(预呈现)"); i++; Response.Write("<br>"); } protected void Page_PreRenderComplete(object sender, EventArgs e) { Response.Write(i + ".PreRenderComplete:呈现内容前发生.(预呈现完成)"); i++; Response.Write("<br>"); } protected void Page_SaveStateComplete(object sender, EventArgs e) { /*网页上控件的状态信息是在 PreRenderComplete 事件后保存的。 在SaveStateComplete事件之前用Trace查看页时其实在该事件前还有 一个SaveState事件,只是这里无法演示. 注意:SaveStateComplete 事件在将页和页上控件的视图状态和控件状态保存到持久性介质之后引发。 这是在页被呈现到请求浏览器之前引发的最后一个事件。*/ Response.Write(i + ".SaveStateComplete:在页已完成对页和页上控件的所有视图状态和控件状态信息的保存后发生."); i++; Response.Write("<br>"); /*最后一部操作 呈现:Render: 它不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法Render()。 所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。*/ /*当你关闭页面的时候就会引发UnLoad(当服务器控件从内存中卸载时发生) 和Disposed两事件(当从内存释放服务器控件时发生,这是服务器控件生存期的最后阶段) 首先加载UnLoad事件:卸载页面:完全呈现页、将页发送至客户端并准备丢弃时, 将调用卸载。此时,将卸载页属性(如Response和Request)并执行清理. 最后加载Disposed事件,释放资源,生命周期结束.... */ } }
一般最常操作的是Page_Load 和Page_PreRender,二者区别在于前者发生在所有控件事件之前,后者发生在所有控件事件之后
asp.net页面默认开启了AutoEventWireup
从浏览器页面触发的事件不能立刻在本地得到处理,而是POST至服务器上,因此,Asp.NET建立了委托(代理)机制。在建立一个事件的同时,建立相应的委托:
private void InitializeComponent()
{
this.mybutton.Click += new System.EventHandler(this.Button1_Click);//委托
}
ASP.NET 页框架支持以自动方式将页事件与方法相关联。如果 Page 指令的 AutoEventWireup 属性被设置为 true,该页框架将自动调用页事件,即 Page_Init 和 Page_Load 等方法。在这种情况下,不需要任何显式的 Handles 子句或委托。
如果将 AutoEventWireup 设置为 true,Visual Studio 将生成用于绑定事件的代码,页框架将自动基于事件的名称来调用事件。
开发人员可以利用该参数避免编写过多的链接代码。如果该属性设置为"false",则代码应改为:
private void InitializeComponent()
{
this.mybutton.Click += new System.EventHandler(this.Button1_Click);//委托
this.Load += new System.EventHandler(this.Page_Load);//可以用AutoEventWireup属性避免的委托
}
但大部分情况下,页面不需要关联如此多的特殊事件,会增加额外的操作和系统开销。同时, ASP.NET 页框架自动调用事件处理的方法基于其预定名称,这会导致到相同事件处理方法当页运行被调用两次,也会增大系统开销。因此,Microsoft 建议始终将 AutoEventWireup 设置为 FALSE。同样 AutoEventWireup 并不能对所有页面事件有效,比如Page_InitComplete()事件就不支持它。
调试
指令Dedug="true"
调试位于远程服务器端的asp.net应用程序时,还要禁掉自定义错误<compilation Dedug="true" /><customErrors mode="off"/>
为页面或应用程序启用调试,调试模式下编译器不会进行某些性能优化,所以正式运营前要确认禁用了调试
System.Web部分中增加 <deployment retail="true"/>: 禁调试默认,允许远程自定义错误并禁止跟踪。
跟踪页面执行Trace="true"
当想要输出页面执行的跟踪信息,就要为页面或整个程序启用跟踪
当<%@ Page %>指令包含Trace="true"属性时,这个属性启用跟踪并将跟踪信息附在页面的底部。
可以在代码的任意位置 主动调用Trace.Warn()方法添加一条跟踪信息到跟踪信息区,所以可以用跟踪来诊断页面的错误
页面跟踪的缺点是任何人都能看到跟踪信息。
程序级跟踪
web.config :
<configuration>
<system.net>
<trace enabled="true" localOnly="false" writeToDiagnosticsTrace="true" mostRecent="true"/>
</system.net>
</configuration>
启用程序级跟踪后,只在访问特殊页面Trace.axd时才会显示跟踪信息(显示启用程序级跟踪后的10次页面请求)
远程服务端需要为trace节点 添加localOnly="false"属性,就算禁用了页面级跟踪,用Trace.Warn()所写的信息也可以通过Trace.axd查看。
使用writeToDiagnosticsTrace属性可以把所有跟踪信息输出到Visual Web Developer的输出窗口
使用mostRecent属性可以显示最新的10次页面请求,而不启用这一属性,那么在10次页面请求后,跟踪将自动停止。
通过添加断点
这个只适用于本地调试