zoukankan      html  css  js  c++  java
  • aspx页面生成详解

    当我们访问ASP.NET网页时,如果是第一次访问,系统会编译相应的网页,编译好的内容会存入“WINDOWS\Microsoft.NET\Framework\version\Temporary ASP.NET Files\项目名称\随机数\随机数”中,下面我们通过详细分析这个编译好的内容来学习aspx页面的整个生成过程。
    首先我们先制作一个简单的aspx页面


    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        
    <title>标题页</title>
    </head>
    <body>
        
        
    <form id="form1" runat="server">
        
    <div>
        
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        
    <asp:DropDownList ID="DropDownList1"
            runat
    ="server">
                
    <asp:ListItem>ListItem1</asp:ListItem>
                
    <asp:ListItem> ListItem2</asp:ListItem>
            
        
    </asp:DropDownList>
        
    </div>
        
    <asp:Button ID="Button1" runat="server" Text="Button" />
        
    </form>
    </body>
    </html>

    当这个页面第一次被访问时,一个包含控件层级结构的类会自动的被创建,这个层级结构可以简单抽象成如下图:

    同时我们可以在“WINDOWS\Microsoft.NET\Framework\version\Temporary ASP.NET Files\项目名称\随机数\随机数”中找到一个App_Web_gfberjo_.dll(你的机器中可能跟我这个不同)文件,现在我们用Reflector工具来反汇编这个dll文件。

    首先我们先看看default_aspx类
    public class default_aspx : _Default, IHttpHandler
    {
        // Fields
        private static object __fileDependencies;
        private static bool __initialized;

        // Methods

        public default_aspx();

        private HtmlHead __BuildControl__control2();

        private HtmlTitle __BuildControl__control3();

        private void __BuildControl__control4(ListItemCollection __ctrl);

        private ListItem __BuildControl__control5();

        private ListItem __BuildControl__control6();

        private Button __BuildControlButton1();

        private DropDownList __BuildControlDropDownList1();

        private HtmlForm __BuildControlform1();

        private TextBox __BuildControlTextBox1();

        private void __BuildControlTree(default_aspx __ctrl);

        protected override void FrameworkInitialize();

        public override int GetTypeHashCode();

        public override void ProcessRequest(HttpContext context);
    }
    程序流程图如下:

    Scott Mitchell对这部分分析的一个抽象源码解释(真实源码并非如此,但跟这个意思差不多),我觉得这段有助于大家理解这部分
    所以贴在下边。


    Page.Controls.Add( 
      
    new LiteralControl(@"<html>\r\n<body>\r\n
        <h1>Welcome to my Homepage!</h1>\r\n
    "));
    HtmlForm Form1 
    = new HtmlForm();
    Form1.ID 
    = "Form1";
    Form1.Method 
    = "post";
    Form1.Controls.Add(
      
    new LiteralControl("\r\nWhat is your name?\r\n"));
    TextBox TextBox1 
    = new TextBox();
    TextBox1.ID 
    = "txtName";
    Form1.Controls.Add(TextBox1);
    Form1.Controls.Add(
      
    new LiteralControl("\r\n<br />What is your gender?\r\n"));
    DropDownList DropDownList1 
    = new DropDownList();
    DropDownList1.ID 
    = "ddlGender";
    ListItem ListItem1 
    = new ListItem();
    ListItem1.Selected 
    = true;
    ListItem1.Value 
    = "M";
    ListItem1.Text 
    = "Male";
    DropDownList1.Items.Add(ListItem1);
    ListItem ListItem2 
    = new ListItem();
    ListItem2.Value 
    = "F";
    ListItem2.Text 
    = "Female";
    DropDownList1.Items.Add(ListItem2);
    ListItem ListItem3 
    = new ListItem();
    ListItem3.Value 
    = "U";
    ListItem3.Text 
    = "Undecided";
    DropDownList1.Items.Add(ListItem3);
    Form1.Controls.Add(
      
    new LiteralControl("\r\n<br /> \r\n"));
    Button Button1 
    = new Button();
    Button1.Text 
    = "Submit!";
    Form1.Controls.Add(Button1);
    Form1.Controls.Add(
      
    new LiteralControl("\r\n</body>\r\n</html>"));
    Controls.Add(Form1);
  • 相关阅读:
    HDU 5791 Two (DP)
    POJ 1088 滑雪 (DPor记忆化搜索)
    LightOJ 1011
    POJ 1787 Charlie's Change (多重背包 带结果组成)
    HDU 5550 Game Rooms (ccpc2015 K)(dp)
    HDU 5542 The Battle of Chibi (ccpc 南阳 C)(DP 树状数组 离散化)
    HDU 5543 Pick The Sticks (01背包)
    HDU 5546 Ancient Go (ccpc2015南阳G)
    NB-IoT的DRX、eDRX、PSM三个模式 (转载,描述的简单易懂)
    MQTT 嵌入式端通讯协议解析(转)
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1620964.html
Copyright © 2011-2022 走看看