服务器端的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(,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...”要求对象引用 (封装注册脚本)

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

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

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

  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. SP703 SERVICE - Mobile Service[DP]

    题意翻译 Description 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动.只有被请求后,他才能移动,不允许在同 ...

  2. 1114 CSS基础

    目录 CSS入门 标签设置长宽 1.字体样式 1.1 字体类型 font-family 1.2 字体大小 font-size 1.3 字体颜色 color 1.4 字体粗细 font-weight 1 ...

  3. JMeter学习之元件的作用域与执行顺序

    1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(conf ...

  4. session.getdefaultinstance和getinstance的区别

    如果想要同时使用两个帐号发送javamail,比如使用1@a.com发送1#邮件,使用2@a.com发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象.但是如果你仍然使用 ...

  5. 037_自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)

    #!/bin/bash#设置变量定义需要添加到防火墙规则的服务和端口号#使用 firewall-cmd --get-services 可以查看 firewall 支持哪些服务 service=&quo ...

  6. nodejs中http服务器,如何使用GET,POST请求发送数据、npm、以及一些插件的介绍

    浏览器给服务器传递参数,最常用的是地址栏传参(get),以及表单提交(post) 先说get传参,就是在url后跟上?key=value&key2=value2...... 但是按照前几篇的h ...

  7. scrapy框架之items项目

    Items 主要目标是从非结构化来源(通常是网页)提取结构化数据.Scrapy爬虫可以将提取的数据作为Python语句返回.虽然方便和熟悉,Python dicts缺乏结构:很容易在字段名称中输入错误 ...

  8. Java 使用线程池分批插入或者更新数据

    需求:在开发业务报表时,需要从MySQL数据库读取数据后进行操作,然后写入数据库,使用定时任务跑批. 分析:①兼顾性能,②  MySQL没有Oracle那么方便.强大的存储过程.综上所述,使用线程池以 ...

  9. java试题复盘——9月26日

    5.在 JAVA 编程中, Java 编译器会将 Java 程序转换为(A) A.  字节码 B.  可执行代码 C.  机器代码 D.  以上都不对 解析: 编译器将Java源代码编译成字节码cla ...

  10. ETL定义、四大模块及子系统说明

    ETL定义.四大模块及子系统说明 ——<Pentaho Kettle解决方案>读书笔记 罗小川 目前公司正在进行数据仓库的建设的前期需求整理和项目启动阶段,想简单来谈一下自己对目前公司在用 ...