我在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);
}
某些回发没有被调用? (按LinkButton时?)
答案 0 :(得分:2)
我会尝试猜测你要做的事情并建议解决方案:
在Page_Init
中,您将填充页面上各种控件的内容。您依赖于URL参数,因此需要if(!IsPostBack)
子句。
在Page_Init之后,您的某些控件处于禁用状态,因此需要在Render方法中启用它们。
在LinkButton上进行回发时,您不会在下一页渲染中看到您的下拉列表。
您遇到的问题是禁用的控件不会持久保存到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问题。
关于你的渲染方法。 “启用”方法在整个页面生命周期中的用途是什么?