服务器端的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);
   }
  }
 }
}

System.Web.UI.Page的页面基类的更多相关文章

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

    服务器端的page类      所有我们编写的页面都继承自page类,可见page类是非常重要的,page类提供了哪些功能,直接决定了我们的页面类可以继承什么功能,或者说,直接决定了我们的页面类功能的 ...

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

    “XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下图 这个是设计页面的样式 这个是后台cs ...

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

    "XXX.Index"不扩展类"System.Web.UI.Page",因此此处不同意的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下 ...

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

    在ASP.NET中,任何页面都是继承于System.Web.UI.Page,他提供了ASP.NET中的Response,Request,Session,Application的操作.在使用Visual ...

  5. 非静态的字段、方法或属性“System.Web.UI.Page.ClientScript.get”要求对象引用

    解决Response.Write("<script>alert('修改失败,请稍后再试!');</script>");布局错误的问题 在后台CS代码(不是C ...

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

    在写项目时想对asp.net的注册前台脚本事件进行封装,就添加了一个BasePage.cs页面,但一直报错‘非静态的字段.方法或属性“System.Web.UI.Page.ClientScript.. ...

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

    #region OnPreInit 第一步(显式重写,文章下面有隐式重写) protected override void OnPreInit(EventArgs e) { //检查 IsPostBa ...

  8. System.Web.UI.Page

    mdsn:点击查看此类介绍 git:   点击查看封装方法   消息弹框,消息弹框跳转,自定义脚本信息 定义:表示一个从托管 ASP.NET Web 应用程序的服务器请求的 .aspx 文件(也称为 ...

  9. System.Web.UI.Page.Cache 页面 缓存 清除

    这个也是网上查询到方法,不错记录一下! /// <summary> /// 清空所有的Cache /// </summary> public static void Clear ...

随机推荐

  1. 笔记本串口连接IBM 小机

    首先要有一根两头母的九针串口线&USB转串口线其次,配置波特率19200.数据位8.停止位1.无校验位.流控:Xon/Xoff P4是9600,P5 P6都是19200了( 默认是19200波 ...

  2. hdu4763 Theme Section【next数组应用】

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  3. ubuntu创建用户的两种方式

    ubuntu创建用户有两种方式: useradd和adduser 这两者,就像零件与产品的关系.useradd是DIY,需要自己调配,adduser是品牌机,拿来就能用. 对于创建一般用户来讲,use ...

  4. 深度学习模型stacking模型融合python代码,看了你就会使

    话不多说,直接上代码 def stacking_first(train, train_y, test): savepath = './stack_op{}_dt{}_tfidf{}/'.format( ...

  5. 【每日一题】 UVA - 1587 Box 二维有点偏序的感觉

    一开始用set存xjb分类讨论,然后wa, 然后简化了一点,改用vector,然wa 最后又发现没有初始化,然wa wa了一个半小时 最后看了题解orz 然后找了一组样例把自己的代码改对了 /* 1 ...

  6. JavaScript面向对象之函数构造器的理解

    1,在使用函数创建类时,函数本身也被称为该类的构造器,该类的构造器方法,该类的构造方法,该类的构造函数等等. 2,注意构造器方法是没有返回值的,当创建该类的实例时,必须调用该类的构造方法. 3,获取构 ...

  7. Usage of git

    目录 Git 配置 查看配置信息 基本概念 Git 创建仓库 git init git clone 撤销操作 从暂存区恢复文件 从仓库恢复某个文件 版本退回 版本前进 分支操作 删除未跟踪的文件 连 ...

  8. xcode工程编译错误:"An instance 0xca90200 of class UITableView was deallocated while key value observers were still registered with it"

    An instance 0xca90200 of class UITableView was deallocated while key value observers were still regi ...

  9. LeetCode 748 Shortest Completing Word 解题报告

    题目要求 Find the minimum length word from a given dictionary words, which has all the letters from the ...

  10. 用Pyinstaller 实现py.转化为exe可执行文件----二维码实例

    1,安装 Pyinstaller 命令提示符窗口:pip install pyinstaller 2,制作二维码脚本 d5_code.py from MyQR import myqr #生成二维码 w ...