继承System.Web.UI.Page的页面基类

服务器端的page类
      所有我们编写的页面都继承自page类,可见page类是非常重要的,page类提供了哪些功能,直接决定了我们的页面类可以继承什么功能,或者说,直接决定了我们的页面类功能的强大与否!那么,page类实现了什么功能呢?如前所述的三个客户端的事实,页面类要管理ViewState,还要管理事件。page类起码要提供这些功能以供我们的页面类重载或者调用。

page类提供了四个顺序执行的事件Init,Load,PreRender和Unload,这四个事件是一条主线,依次标明了page类执行的各个阶段。init事件发生在所有服务器端控件的状态(ViewState)被存储之前。load事件发生在所有服务器端控件的状态被存储之后和所有的事件被触发之前。PreRender事件发生在所有事件被触发之后和要回发给客户端的html还没有回发(这个过程也叫"呈现")之前。unload事件发生在所有html都回发完成以后。从这四个事件可以看到page类的大致执行步骤。

详细的page类事件顺序是这样的:

获得客户端的post请求→page类的继承类被构造→page类的ProcessRequest方法被调用→init事件被执行→page类的虚函数CreateChildControls被调用→服务器端控件的状态(来自post变量和ViewState)被存储→load事件被执行→我们自定义的服务器端控件的事件被执行→PreRender事件被执行→page类的虚函数Render方法被调用→page类的虚函数RenderChildren方法被调用→Http响应发往客户端→unload事件被执行→page类的继承类被解构。

我们知道一个页面上的控件很多是包含(父子)关系,所以这里的CreateChildControls和RenderChinldren函数应该就不难理解了。这个事件顺序是理解asp.net页面类的关键,和前面客户端的三个事实结合起来理解,就可以解释asp.net怎么样把客户端和服务器端结合起来,从而实现从脚本编程转移到面向对象编程。无论是微软提供的webcontrols,或者是用户自定义控件,涉及到客户端和服务器端交互,原理都与此类似。

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CommonClass
{
 /// <summary>
 /// 页面的基类。 ///
 /// </summary>
 public class PageBase:System.Web.UI.Page
 {
  public PageBase()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  /// <summary>
  /// 模块名称
  /// </summary>
  public String ModuleName
  {
   set{ViewState["ModuleName"]=value;}
   get{return ViewState["ModuleName"].ToString();}
  }
  private string _Message;
  /// <summary>
  /// 向用户显示信息提示
  /// </summary>
  public String Message
  {
   get{return _Message;}
   set{_Message = value;}
  }
  /// <summary>
  /// 检查是否有特定的权限
  /// </summary>
  /// <param name="sec">安全选项</param>
  /// <returns></returns>
//  public bool CheckPermissionSuccess(Framework.SecurityOption sec)
//  {
//   //TODO:实现Framework.Security类,如浏览、修改、管理权限
//   return Framework.Security.CheckValid(this.ModuleName,sec);
//  }
  /// <summary>
  /// 页最顶端的PlaceHolder
  /// </summary>
  public System.Web.UI.WebControls.PlaceHolder plhTopHolder;
  /// <summary>
  /// 页最底端的PlaceHolder
  /// </summary>
  public System.Web.UI.WebControls.PlaceHolder plhBottomHolder;

  protected override void OnInit(EventArgs e)
  {
   //初始化控件
   plhTopHolder = new PlaceHolder();
   plhBottomHolder = new PlaceHolder();

   //添加顶端PlaceHolder
   Control form1 = this.FindControl("Form1");
   if (form1 != null) form1.Controls.AddAt(0,plhTopHolder);

   //添加页眉的用户自定义控件
   ITemplate Header = Page.LoadTemplate("~/Controls/Header.ascx");
   this.plhTopHolder.Controls.Add(Header);

   //event
   this.Load+=new EventHandler(PageBase_Load);
   this.Error+=new EventHandler(PageBase_Error);
   this.PreRender+=new EventHandler(PageBase_PreRender);

   base.OnInit (e);
  }
  private void PageBase_Load(object sender, EventArgs e)
  {
   //添加底端PlaceHolder
   Control form1 = this.FindControl("Form1");
   if (form1 != null) form1.Controls.Add(plhBottomHolder);
   //添加页脚的用户自定义控件
   //ITemplate Footer = Page.LoadTemplate("~/Controls/Footer.ascx");
   //this.plhBottomHolder.Controls.Add(Footer);

  }
  private void PageBase_Error(object sender, EventArgs e)
  {
#if !Debug
//   Exception exc = Server.GetLastError();
//   记录未处理的错误
//   XMLLog.AddErrorLog(exc,userName);
//   Server.Transfer("~/PageError.aspx?error=" + Server.HtmlEncode(exc.Message));
#endif
  }
  private void PageBase_PreRender(object sender, EventArgs e)
  {
   //添加信息提示
   if (this._Message != null && this._Message != String.Empty)
   {
    LiteralControl litMessage = new LiteralControl("<div class=/"CssMessage/"><p>" + Message + "</p></div>");
    plhTopHolder.Controls.Add(litMessage);
   }
  }
 }
}
时间: 2024-08-27 20:33:21

继承System.Web.UI.Page的页面基类的相关文章

“XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题

“XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下图 这个是设计页面的样式 这个是后台cs文件代码 如果这两地方的路径不一致则会导致上述错误出现 解决方法:将这两个地方的路径统一即可解决

System.Web.UI.Page的用法,一定要学会懒

在ASP.NET中,任何页面都是继承于System.Web.UI.Page,他提供了ASP.NET中的Response,Request,Session,Application的操作.在使用Visual Studio 创建ASP页面时,系统会自动为你创建一个继承与System.Web.UI.Page的类与页面文件关联. public partial class yourPage:System.Web.UI.Page { protected void Page_Load(Object sender,

非静态的字段、方法或属性“System.Web.UI.Page.ClientScript...”要求对象引用 (封装注册脚本)

在写项目时想对asp.net的注册前台脚本事件进行封装,就添加了一个BasePage.cs页面,但一直报错‘非静态的字段.方法或属性“System.Web.UI.Page.ClientScript...”要求对象引用”’ 原写法: /// <summary> /// 显示客户端提示框 /// </summary> /// <param name="msg"></param> public static void ShowMsg(strin

ASP.NET中System.Web.UI.Page的继承问题

看了一些文章,通过写PageBase的页面并使其它page继承这个PageBase,可以方便地实现用户检验等需求. 后来发现子类page继承后,父类的PageLoad不执行了. 以下帖子提出了问题,但是没有提供正解: http://bbs.csdn.net/topics/390482363?ticket=ST-704066-MoolZ4f7GW3lTwMCb6cK-passport.csdn.net 问题原因: 子类Page_Load覆盖了父类的Page_Load方法. 解决方法: 给子类方法前

System.Web.UI.Page事件执行顺序

#region OnPreInit 第一步(显式重写,文章下面有隐式重写) protected override void OnPreInit(EventArgs e) { //检查 IsPostBack 属性来确定是不是第一次处理该页. //创建或重新创建动态控件. //动态设置主控页. //动态设置 Theme 属性. //读取或设置配置文件属性值. //注意 //如果请求是回发请求,则控件的值尚未从视图状态还原.如果在此阶段设置控件属性,则其值可能会在下一事件中被重写. base.OnPr

ASP.NET(C#)——不扩展System.Web.UI.Page

错误原因:复制,移动,重命名导致配置不对. xxx.aspx文件的MasterPageFile和Inherits与xxx.aspx.cs文件的命名空间和类名不一致. 解决方法: 修改xxx.aspx文件或者xxx.aspx.cs文件. <%@ Page Title="" Language="C#" MasterPageFile="~/xxx/xxx.Master" AutoEventWireup="True" CodeB

[转]后台页面访问权限:页面基类&amp;内置票据认证 使用方法

本文转自:http://www.cnblogs.com/fishtreeyu/archive/2011/01/29/1947421.html 一般网站后台页面除了登录页面login.aspx未登录用户可访问外,其它页面必须登录用户才可访问, 当用户未登录时进入某个页面则自动判断并跳转到登录页面: (如果login.aspx页面用到图片及Css.Js文件,那么也必须允许未登录用户可访问Images.Css.Js文件夹) 方法一:运用页面基类BasePage.cs 1.BasePage.cs代码:

System.Web.UI.HtmlControls

用来创建一个标签.HtmlContainerControl 一般用此类来新建标签. 可能我们熟悉System.Web.UI.WebControls;空间.System.Web.UI.WebControls 命名空间包含允许您创建在网页上的 Web 服务器控件的类. 最常见的就是用到数据绑定控件时需要获取每个数据时 绑定数据时: 后台获取此数据: 更多去MDSN里面看吧 与此控件类似的就是System.Web.UI.HtmlControls 命名空间.System.Web.UI.HtmlContr

“System.Web.UI.WebControls.Literal”不允许使用子控件

今天在写下面的代码时遭遇错误——“System.Web.UI.WebControls.Literal”不允许使用子控件('System.Web.UI.WebControls.Literal' does not allow child controls): var postBodyDiv = new HtmlGenericControl() { ID = "cnblogs_post_body", ClientIDMode = ClientIDMode.Static, TagName =