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頁面中的其余部分。

                     |--  page 指令
                              用於定義JSP頁面的各種屬性,可位於任何位置,為了可讀性,一般位於頁面的起始位置
                              <% page
                                         language="java"  
                                         extends="package.class"  
                                         import="java.util.*"        |      "{java.util.*,package.class}"
                                                         默認導入的包(不需要用戶導入)有
                                                                java.lang.*,
                                                                javax.servlet.*,
                                                                javax.servlet.jsp.*,
                                                                javax.servlet.http.*
                                         session="true|false"                             // 默認是true
                                         errorPage="relative_url"                      // web.xml 中  <web-app/>下配置  <error-page/>      
                                         isErrorPage="true|false"  
 
                                         pageEncoding="utf-8|iso8859-1|gbk"                                                    
                                                翻譯引擎翻譯時默認的解碼方式是utf-8 (page指令 pageEncoding)
                                         contentType="text/html;charset=utf-8”
                                                服務器默認傳輸/解析頁面文件的編碼方式時是使用ISO8859-1  (pageEncoding)
                                                瀏覽器的默認解碼/編碼方式是操作系統的默認編碼方式  (contentType)
 
                                                 jsp中只要設置過pageEncoding,就不用設置contentType
 
                                         isELIgnored="true|false"
                                             EL表達式是JSP2.0(JAVAEE1.4)的規范中的一門技術。tamcat需要升級到6.0,或者設置本屬性 isELIgnored="false"。
                                             
                                        buffer="none|8kb|sizekb"  默認8kb
                                        autoFlush="true|false"        默認true,緩沖區滿了后先將滿了的數據轉入response的緩沖區。false,則如果滿了后還寫數據,則直接拋異常。
                                               配置out的緩沖區
                             %>
                                
                      |---include指令
                            include指令用於引入其他JSP頁面,若果使用Include指令引入了其他JSP頁面,那么JSP引擎將把這兩個JSP翻譯成一個servlet
                                 <%request.getRequestDispatcher("/include/head.jsp").include(request,response);%>
                                 <%@include file="/include/head.jsp"%>
                      |---taglib指令
                            用於在JSP頁面中導入標簽庫,自定義標簽時使用
 
 8、 jsp中九大隱式對象
   page               : Servlet
   config             : ServletConfig
   application      : ServletContext
   request           : HttpRequest
   response        : HttpResponse
   session           : HttpSession
   out                 : 相當於response.getWriter得到的PrintWriter,但不同在於,其本身就有一個緩沖區,
                           利用out寫出的內容會先緩沖在out的緩沖區,待滿了或整個頁面結束了才會轉入response的緩沖區。
                            例證:  include指令
           在jsp頁面中需要進行數據輸出時,不要自己獲取response.getWriter,而是要使用out進行輸出,防止即用out又用response.getWriter而導致輸出順序錯亂的問題
 
   exception      
   pageContext
            (1)可以作為入口對象,獲取其他八大隱式對象的引用
                getException方法返回exception隱式對象
                getPage方法返回page隱式對象
                getRequest方法返回request隱式對象
                getResponse方法返回response隱式對象
                getServletConfig方法返回config隱式對象
                getServletContext方法返回application隱式對象
                getSession方法返回session隱式對象
                getOut方法返回out隱式對象
            (2)域對象,四大作用域的入口,可以操作四大作用域中的域屬性
               
                作用范圍: 當前jsp頁面
                生命周期: 當對jsp頁面的訪問開始時,創建代表當前jsp的PageContext,當對當前jsp頁面訪問結束時銷毀代表當前jsp的pageContext
                作用:在當前jsp中共享數據
               
                    public void setAttribute(java.lang.String name,java.lang.Object value)
                    public java.lang.Object getAttribute(java.lang.String name)
                    public void removeAttribute(java.lang.String name)
 
                    public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
                    public java.lang.Object getAttribute(java.lang.String name,int scope)
                    public void removeAttribute(java.lang.String name,int scope)
                   
                    PageContext.APPLICATION_SCOPE
                    PageContext.SESSION_SCOPE
                    PageContext.REQUEST_SCOPE
                    PageContext.PAGE_SCOPE
 
                    findAttribute方法 -- 搜尋四大作用域中的屬性,如果找到則返回該值,如果四大作用域中都找不到則返回一個null,搜尋的順序是從最小的域開始向最大的域開始尋找
                   
            (3)提供了請求轉發和請求包含的快捷方法
                pageContext.include("/index.jsp");
                pageContext.forward("/index.jsp"); 
 
————————————————————————
    3.零散知識
        (1)jsp映射
           <servlet>
                <servlet-name>index</servlet-name>
                <jsp-file>/index.jsp</jsp-file>
          </servlet>
          <servlet-mapping>
                <servlet-name>index</servlet-name>
                <url-pattern>/jsp/*</url-pattern>
         </servlet-mapping>
           
        (2)JSP最佳實踐
          JSP作為數據顯示模版使用,而servlet做控制器組件。servlet響應請求產生數據,並把數據通過轉發技術帶給jsp,用jsp顯示數據。
            通過自定義標簽等技術,實現在JSP中不出現任何JAVA代碼。
            
        (3)域的總結
            servletContext (application)
            session (session)
            request (request)
            pageContext
           
            如果一個數據只在當前jsp頁面使用,可以使用pageContext域存儲
            如果一個數據,除了在當前Servlet中使用,還要在請求轉發時帶到其他Servlet處理或jsp中顯示,這個時候用request域
            如果一個數據,除了現在我自己要用,過一會我自己還要用,存在session域
            如果一個數據,除了現在我自己要用過一會其他人也要用,存在ServletContext域中

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>&nbsp" +
                    ";");
            @__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次頁面請求后,跟蹤將自動停止。

通過添加斷點

 這個只適用於本地調試

 


免責聲明!

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



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