改变ascx的pageLoad和页面的pageLoad执行顺序(转)

时间:2023-01-09 17:08:38

今天做东西遇见一个问题,为了节省开销,需要获取一个用户控件的属性值显示在页面上

但是ascx的赋值是在 Page_Load(object sender, EventArgs e)中进行的,

test.ascx.cs:
public int PageSize
        {
            get;
            set;
        }

        public void Page_Load(object sender, EventArgs e)
        {
            PageSize = 10;
        }


test.aspx:
    <uc1:Test ID="ascxTest" runat="server" />
    <asp:Literal ID="pageLtr" runat="server"></asp:Literal>
test.aspx.cs:
        protected void Page_Load(object sender, EventArgs e)
        {
            pageLtr.Text = "最后输出:"+ ascxTest.PageSize.ToString();
        }

结果:
最后输出:0

原因:用户控件的page_load事件在页面的page_load事件之后

从网上找了找,解决方法修改test.ascx.cs将其Page_Load方法改为public
修改test.aspx.cs为:
       protected void Page_Load(object sender, EventArgs e)
        {
            ascxTest.Page_Load(null, null);
            pageLtr.Text = "最后输出:"+ ascxTest.PageSize.ToString();
        }
结果:
最后输出:10

问题解决了吗?
调试了下,发现ascx的pageload事件执行了两次,我们的本意是为了节省开销,这样的话不是没有任何意义吗?

最后修改test.aspx.cs
        protected void Page_Load(object sender, EventArgs e)
        {
            ;
            ;
        }
        protected void Page_PreRender(object sender, EventArgs e)
        {
            pageLtr.Text = "最后输出:" + ascxTest.PageSize.ToString();
       
        }
解决问题

看来页面的生命周期真的很重要,啥时候有空了记录一下