现在的位置: 首页 > 综合 > 正文

模板页和内容页的运行机理

2018年02月18日 ⁄ 综合 ⁄ 共 2529字 ⁄ 字号 评论关闭

在加载母版页和内容页共需要经过8个过程。这8个过程显示初始化和加载母版页及内容页是一个相互交叠的过程。基本过程是,初始化母版页和内容页控件树,然后,初始化母版页和内容页页面,接着,加载母版页和内容页,最后,加载母版页和内容页控件树。以上8个过程对应着11个具体事件。这些事件如下所示。    

  (1)母版页中控件Init事件;

  (2)内容页中Content控件Init事件;

  (3)母版页Init事件;

  (4)内容页Init事件;

  (5)内容页Load事件;

  (6)母版页Load事件;

  (7)内容页中Content控件Load事件;

  (8)内容页PreRender事件;

  (9)母版页PreRender事件;

  (10)母版页控件PreRender事件。

  (11)内容页中Content控件PreRender事件。

    实际上,8个过程或者是11个事件都用于说明母版页和内容页中的具体事件顺序。内容页和母版页中会引发相同的事件。例如,两者都引发Init、Load和PreRender事件。引发事件的一般规律是,初始化Init事件从最里面的控件(母版页)向最外面的控件(Conetent控件及内容页)引发,所有其他事件则从最外面的控件向最里面的控件引发。需要牢记,母版页会合并到内容页中,并被视为内容页中的一个控件,这一点十分有用。

    在创建应用程序中,必须注意以上事件顺序。例如,当在内容页中访问母版页的属性或者服务器控件时,如果按照过去的处理思路,可能会在内容页的Page_Load事件处理程序中加以实现。由前文可知,在母版页Load事件引发之前,内容页Load事件已经引发,那么过去的思路显然是不正确的。如何才能在内容页中访问母版页包含对象呢?可参考“5.5访问母版页控件和属性”一节中介绍的实现方法。



附录:
母版页判断登陆 及 母版页与内容页的执行顺序 

在checkLogin.cs里有check方法:

public static void check(Page aPage)

    {

        if (aPage.Session["ok"] == null || aPage.Session["ok"].ToString() != "ok")

        {

            aPage.Response.Redirect("login.aspx");

        }

    }

在母版页里调用的正确方法:

protected void Page_Init(object sender, EventArgs e)

    {

        checkLogin.check(this.Page);

    }

原因:

母版页和内容页的执行顺序:

母版页中控件的Init->内容页控件的Init->母版页的Init->内容页的Init

->内容页的Load->母版页的Load->内容页中控件的Load

->内容页的PreRender->母版页的PreRender->母版页控件的PreRender->内容页中控件的PreRender

出错方法:

1、checkLogin.check(mypage);

运行:MasterPage类转Page类出错

2、Page mypage=new Page();

checkLogin.check(mypage);

运行:System.Web.HttpException: 响应在此上下文中不可用。

3、用户自定义控件MasterPublicMethod.ascx,调用检查方法

protected void Page_Load(object sender, EventArgs e)

    {

        checkLogin.check(this.Page);

    }

控件加入母版页:<uc1:MasterPublicMethod id="MasterPublicMethod1" runat="server"></uc1:MasterPublicMethod>

这个方法改成:在母版页的Page_Load事件里:checkLogin.check(this.Page);

运行:正常

出错原因:事件执行顺序:内容页的Page_Load事件->母版页的Page_Load事件,要在页面最开始检查有没有登录

4、母版页:

protected void Page_Load(object sender, EventArgs e)

    {

        //Response.Write("母版");

        checkLogin.check(this.Page);

    }

内容页的Page_LoadComplete事件:

protected void Page_LoadComplete(Object sender, EventArgs e)

    {

        int t, bid;

        //初始化自定义控件用的参数

        pg = Convert.ToInt32(Request.QueryString["pg"]);

        bid = Convert.ToInt32(Request.QueryString["id"]);

        t = Convert.ToInt32(Request.QueryString["t"]);

        switch (t)

        {

            case 1:

                //回复

                break;

            case 2:

                //修改回复

                break;

            case 3:

                //隐藏

                HideBook(bid);

                break;

            case 4:

                //删除

                DelBook(bid);

                break;

        }

    }

修改原因:页面执行顺序:内容页的Page_Load->母版页的Page_Load->内容页的Page_LoadComplete

运行:自定义控件里有变量未赋值出错

出错原因:有的内容页里有自定义控件,自定义控件的Page_Load事件里有代码,自定义控件的参数在内容页的Page_LoadComplete事件里初始化

Page_Load的执行顺序:内容Page_Load->母版Page_Load->自定义控件Page_Load->内容Page_LoadComplete

抱歉!评论已关闭.