ASP.NET:在父页面的Page_Load之前运行

时间:2009-03-24 09:26:09

标签: c# asp.net

我在User控件中有一段代码通常应放在Page_Load中(初始化其他组件,如DropDowns等),但我需要在托管此控件的页面的Page_Load之前进行此操作。

我试着把它放在Page_Init:

protected void Page_Init(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    Methods.PopulateWhatList(cboWhatList0, cboWhatList1, fldWhat, Request["WhatId"], true);
    Methods.PopulateWhereList(cboWhereList0, cboWhereList1, fldWhere, Request["WhereId"], true);
    Methods.PopulateWhoList(cboWho, true, Request["WhoId"]);
    Methods.PopulateWhenList(cboWhen, true, Request["WhenId"]);
    Methods.PopulatePriceRangeList(cboPriceRange, true, Request["PriceRangeId"]);      
  }
}

......但遇到了一些问题。那么这类代码最好的地方在哪里?

我遇到的问题(可能是无关的)是我的:

 protected override void Render(HtmlTextWriter writer)
 {
   Methods.EnableValidationWhereList(cboWhereList1, this.Page);
   Methods.EnableValidationWhatList(cboWhatList1, this.Page);
   base.Render(writer);
 }

某些回发没有被调用? (按LinkBut​​ton时?)

2 个答案:

答案 0 :(得分:2)

我会尝试猜测你要做的事情并建议解决方案:

Page_Init中,您将填充页面上各种控件的内容。您依赖于URL参数,因此需要if(!IsPostBack)子句。

在Page_Init之后,您的某些控件处于禁用状态,因此需要在Render方法中启用它们。

在LinkBut​​ton上进行回发时,您不会在下一页渲染中看到您的下拉列表。

您遇到的问题是禁用的控件不会持久保存到ViewState。由于在Render之前调用了SaveViewState,因此您在页面生命周期中启用控件的时间太晚了。

如果您将Methods.EnableValidation...调用移至页面上的Pre_Render方法,控制状态将持久保存到ViewState。

在修复之后,您应该将Page_Init方法中的代码移动到它所属的Page_Load方法。这样,如果您正在回发,您的控件数据将从ViewState加载。

答案 1 :(得分:0)

页面生命周期使得页面的page_load在控件的page_load之前运行。

如果您需要在页面加载之前初始化数据源,那么您可以将初始化放在OnInit中,前提是确保首先调用base.OnInit()。理想情况下,您应该保持对page_load机制的数据绑定调用,以确保您没有viewstate问题。

关于你的渲染方法。 “启用”方法在整个页面生命周期中的用途是什么?