服务器端的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. Python2.7编译失败 Failed to build these modules:_curses_panel _hashlib _ssl

    1:*** WARNING: renaming "_ssl" since importing it failed: libssl.so.1.0.0: cannot open sha ...

  2. day11 十一、函数对象,名称空间,作用域,和闭包

    一.函数对象 1.函数对象:函数名存放的就是函数的地址,所以函数名也是对象,称之为函数对象 a = 10 print(a,id(a)) def fn(): num = 10 print('fn fuc ...

  3. vue setTimeout 注销

    vue在切换页面时,销毁了上衣个组件,上一个页面的也要相应的setTimeout 注销: setTimeout(function () { if(that && !that._isDe ...

  4. tensorRT 构建推理引擎

  5. C和C指针小记(十一)-递归和迭代优化

    1.递归 C通过运行时堆栈支持递归函数的实现. 递归函数就是直接或间接调用自身的函数. 一个小例子: /** 使用递归将整型转换为ascii字符 @param value 整型数 */ void bi ...

  6. win10 SVN不能显示图标

    参考的解决办法有很多(http://blog.csdn.net/lishehe/article/details/8257545),大多数是操作一下注册表. 我就按照他们的办法,svn的注册表顺序根本上 ...

  7. __dict__和dir()的区别:未完

    1.  dir()是一个函数,返回的是list.__dict__是一个字典,键为属性名,值为属性值: 2.  dir()用来寻找一个对象的所有属性,包括__dict__中的属性,所以说__dict__ ...

  8. [dpdk] dpdk编译成动态库使用 -- PCI port自动发现与pmd动态加载

    1.  修改配置文件 .conf, 设置如下变量的值. [root@D129 x86_64-native-linuxapp-gcc]# cat dpdk/x86_64-native-linuxapp- ...

  9. Excel--数据分列功能

    原文:http://www.ittribalwo.com/article/3963.html excel分列功能一:按照固定宽度进行数据拆分 情景: 如下图所示,在日常工作中,我们经常需要根据人员的身 ...

  10. Monkey简介及环境搭建(1)

    简介:Monkey是Android SDK自带的测试工具,是一个命令行工具,可以运行在模拟器中或者实际设备中,它向系统发送伪随机的用户事件流(如按键输入,触摸屏输入,手势输入等),实现对正在开发的应用 ...