自定义Page集类可以带来很多好处,如统一处理Cookie,安全性,参数等。不过在继承System.Web.UI.Page实现自己的BasePage时需要注意一点:谨慎的处理构造器(Constructor)中涉及的代码。如果疏忽了这点,可能会导致你在Vs.Net中无法所见即所得的编辑Aspx页面,打开页面时将抛出以下错误,你只能看到Html代码界面。

导致这一错误的最大可能的原因就是你在BasePage的构造器里使用了HttpContext的内容。而Vs.Net在显示所见即所得的Aspx页面时会初始化你的BasePage类,这时候如果使用了Request,Response等类时,由于HttpContext并不存在(因为不是在IIS环境中,没有PageFactory传递过来Http上下文),所以在初始化类时就抛出了NullReferenceException。
为了解决此问题,最好将访问HttpContext的代码放到OnInit中,如下:
protected override void OnInit(EventArgs e)
{
base.OnInit (e);
HttpCookieCollection cookies = HttpContext.Current.Request.Cookies;
}
这一override方法指示在PageHandler阶段被首先调用,而Vs.Net显示页面时并不会调用此方法,所以不会产生NullReferenceException。
如果你确实需要在构造器中进行某些Field的初始化等工作,这时又需要使用Request等内容,那么就需要先判断HttpContext是否为Null。如下:
public class BasePage : Page
{
public BasePage()
{
if(HttpContext.Current != null)
{
HttpCookieCollection cookies = HttpContext.Current.Request.Cookies;
}
}
}
打印 | 张贴于 2005-09-27 17:10:00 | Tag:DOTNET
留言反馈
--------------------------------------------------------------------------------
无法找到表 0。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.IndexOutOfRangeException: 无法找到表 0。
源错误:
行 47: ds.Clear()
行 48: ds = GetDataFromDB(sqlstr)
行 49: count = ds.Tables(0).Rows.Count
行 50: ' If count > 0 Then
行 51: sqlstr = "select * from userID where " & _
源文件: C:\Inetpub\wwwroot\WebApplication1\WebFrmLogin.aspx.vb 行: 49
堆栈跟踪:
[IndexOutOfRangeException: 无法找到表 0。]
System.Data.DataTableCollection.get_Item(Int32 index)
WebApplication1.WebFrmLogin.Button1_Click(Object sender, EventArgs e) in C:\Inetpub\wwwroot\WebApplication1\WebFrmLogin.aspx.vb:49
System.Web.UI.WebControls.Button.OnClick(EventArgs e)
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain()
同样的代码我在WINDOWS窗体中运行没有错误,但把这个代码移到WEB程序中就出现这样的错误码率。请教一下这个问题是怎么产生的!