就能看得出来. 而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属性 的运用 终于说到本文的重点了,可能这部分也不会说很多,但是上面说的确实是为这里服务的。
也不多说了,太长的文章一般没人看,何况我写的比较肤浅,并且不够精彩。在这里就举两个例子。一个是身份验证问题(Session),还有个是全局会话(Application)。
1)、Session 用户登陆后一般要通过Cookice或者Session来控制权限等。但是通过使用一个控件(比如ascx)又觉得不够好。那么,这个时候System.Web.HttpContext.Current就能发挥作用了。
比如,你可以让所有的需要身份验证的页面都继承自MPage类。如下:
using System;
using System.Web;

namespace MyTest
{
 /**//// <summary>
/// MyTest 的摘要说明。
/// </summary>
public class MPage : System.Web.UI.Page
 {
public MPage()
 {
//
// TODO: 在此处添加构造函数逻辑
//
if(HttpContext.Current.Session["MySession"]==null || HttpContext.Current.Session["MySession"]==String.Empty)
HttpContext.Current.Response.Redirect("login.ASPx",true); //如果Session验证不通过,那么跳转到登陆页.

}
}
} 然后在Default.ASPx.cs文件中_Default类继承该类
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文件的时候就需要身份验证了。如果已经通过身份验证,而web.config或者dll文件被改动,那么Session会被取消(调试的时候要注意)。
2、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>
 全文完。
|