我对 asp.net lifecylce 层次结构有疑问。
基本上,我有一个用户控件,其中有一个 GridView。并且这个 GridView 是基于控件上的公共属性(在下面的简化代码中名为 Parameter)动态生成的。
当我将此控件插入 aspx 页面、设置其 Parameter 属性并在其上调用 DataBind(Parameter) 时,一切都很好。GridView 在 UI 上生成并填充。
当我回发页面时出现问题。我必须重新生成 GridView 结构,以便控件的 ViewState 中的数据可以用于填充 GridView。这样我才能实现它的内容。但只要 GridView 结构是动态生成的,并且是基于其上设置的 Parameter 属性,这是不可能的。因为用户控件的 OnInit 在页面的 OnInit 之前被调用,这就是为什么在 GridView 结构生成之后设置 Parameter 属性的原因。结果,我最后得到了一个空的 Gridview。
这是简化的代码。
你能给我一些建议如何克服这个问题吗?
我可以明确强制 asp.NET 重新加载 gridview 的 ViewState 吗?
Page HomePage.aspx有一个OnInit 事件处理程序,它设置用户控件ctlMyUSerControl的属性
protected override void OnInit(EventArgs e)
{
ctlMyUserControl.Parameter = new Parameter()
name="Orhan",
surname= "Pamuk"};
}
在ctlMyUserControl的 OnInit 我有
protected override void OnInit(EventArgs e)
{
if (Page.IsPostBack && Parameter !=null && SomeGridViewRowsExistOnUI)
{
// Generate dynamic columns based on Parameter property
// So that gridview can be populated
// with the post-backed data which
// should contain the ViewState of the gridview
GenerateGridViewColumns(Parameter);
}
base.OnInit(e);
}