程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET頁面提前處理問題

ASP.NET頁面提前處理問題

編輯:.NET實例教程

1、.Net的HTTP請求

.Net與ASP的運行機制有很大不同.

ASP的請求與響應是,ASP頁面被請求,然後逐行解釋.是基於過程的.最多是包含了文件,需要先引入文件罷了.

而.Net,在頁面被請求後,首先是加載HTTP Module,這不是本文的重點.然後再加載HTTP Handler.這也不是本文的重點.加載的這兩項,都需要在Webconfig文件中配置.大家知道的URL轉址就是這麼實現的.在完成這些之後才開始給出響應的頁面.

在給出響應頁面的工作中,.Net就表現出和ASP的最大區別來..Net是面向對象的語言,是基於類的語言.沒有類很難寫出有意義的.Net程序.如果寫出來,也就是個ASP的翻版.

2、.Net中基本文件結構(繼承關系)
首先大家看到無論在1.1還是2.0中,用VS創建的網站每個aspx文件都對應一個cs文件(或者vb等其它語言).而cs文件裡的類一般和文件同名,如果遇見關鍵字的情況才會自動使類名前加個'_',例如:_Default.創建的這個cs文件繼承自System.Web.UI.Page類,而且只能\必須繼承該類.原因就是ASPx文件是繼承cs文件的.

就拿Default.aspx,Default.ASPx.cs文件來說.
Default.ASPx.cs裡包含了類 _Default,繼承字System.Web.UI.Page
通過

    public class _Default : System.Web.UI.Page
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            // 在此處放置用戶代碼以初始化頁面
        }
    }
}

就能看得出來.
而Default.ASPx文件,雖然沒有闡明用的哪個類,但是,實際上已經繼承自_Default類.
 

<%@ Page language="c#" Codebehind="Default.ASPx.cs" AutoEventWireup="false" Inherits="MyTest._Default" %>
<!DOCTYPE Html PUBLIC "-//W3C//DTD Html 4.0 Transitional//EN" >
<Html>
    <HEAD>
        <title>Default</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .Net 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClIEntScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/IE5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <FONT face="宋體"></FONT>
        </form>
    </body>
</Html>

以上代碼第一句話最後Inherits="MyTest._Default"就表明了這點.這個文件我是以VS2003建立的,也就是 .Net1.1,MyTest是我用的命名空間。

3、類的運行機制
說了這麼多,實際上我們還是沒有說到System.Web.HttpContext類。但是我們現在說的東西對於System.Web.HttpContext類運用很有幫助。

我們訪問了Default.aspx,那麼是只訪問Default.ASPx文件,或者該類麼?答案當然不是。.Net中當子類被請求時,會先實例化父類。先建立父類的字段,然後是構造函數。

 

    public class _Default : System.Web.UI.Page
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            // 在此處放置用戶代碼以初始化頁面
        }

        Web 窗體設計器生成的代碼#region Web 窗體設計器生成的代碼
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: 該調用是 ASP.Net Web 窗體設計器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        /**//// <summary>
        /// 設計器支持所需的方法 - 不要使用代碼編輯器修改
        /// 此方法的內容。
        /// </summary>
        private void InitializeComponent()
        {    
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }

從上面的類中可以看出,該類沒有字段,也沒有構造函數。實例化它又得先實例化System.Web.UI.Page類。System.Web.UI.Page類不是本文要討論的。在實例化_Default類的時候首先執行的是OnInit方法。它重寫了System.Web.UI.Page.OnInit。然後調用InitializeComponent方法,而InitializeComponent方法又調用了Load事件,執行了Page_Load方法。

在Page_Load方法被執行之前,System.Web.UI.Page類的很多對象是不能使用的,比如:Application,Session等。

4、System.Web.HttpContext類Current屬性 的運用
終於說到本文的重點了,可能這部分也不會說很多,但是上面說的確實是為這裡服務的。

也不多說了,太長的文章一般沒人看,何況我寫的比較膚淺,並且不夠精彩。


1、Application
快吃飯了,晚上還有點事情,這裡就不詳細介紹了。如果需要用的朋友可以給我留言,我會解答的。

Application可以這樣使用:
 

using System;
using System.Web;

namespace MyTest
{
    /**//// <summary>
    /// MyTest 的摘要說明。
    /// </summary>
    public class MPage : System.Web.UI.Page
    {
        public MPage()
        {
            //
            // TODO: 在此處添加構造函數邏輯
            //
            try
            {
                if(HttpContext.Current.Application.Count<1)
                    HttpContext.Current.Application.Add("Title","我的網站");    //在Application沒有被創建的時候執行
            }
            catch
            {
                HttpContext.Current.Response.Redirect("Err.Htm",true);    //出現錯誤,跳轉到錯誤頁面
            }
        }

        public string My_Title
        {
            get
            {
                return Application["Title"].ToString();
            }
        }
    }
}


Default.ASPx.cs繼承
 

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace MyTest
{
    /**//// <summary>
    /// _Default 的摘要說明。
    /// </summary>
    public class _Default : MPage
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            // 在此處放置用戶代碼以初始化頁面
        }

        Web 窗體設計器生成的代碼#region Web 窗體設計器生成的代碼
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: 該調用是 ASP.Net Web 窗體設計器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        /**//// <summary>
        /// 設計器支持所需的方法 - 不要使用代碼編輯器修改
        /// 此方法的內容。
        /// </summary>
        private void InitializeComponent()
        {    
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }
}


Default.ASPx 文件使用
 

<%@ Page language="c#" Codebehind="Default.ASPx.cs" AutoEventWireup="false" Inherits="MyTest._Default" %>
<!DOCTYPE Html PUBLIC "-//W3C//DTD Html 4.0 Transitional//EN" >
<Html>
    <HEAD>
        <title><% = My_Title %></title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .Net 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClIEntScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/IE5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <FONT face="宋體"></FONT>
        </form>
    </body>
</Html>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved