我有一个相当复杂的页面。 ASPX页面加载一个用户控件,该控件又加载一个子用户控件。
家长控制
protected override void OnInit(EventArgs e)
{
//Loads child control
}
在子用户控件中,我使用继承自System.Web.UI.HtmlControls.HtmlSelect
ASCX:
<cust:CustDropDownList id="ctlDdl" runat="server"/>
ASCX.CS
protected void Page_Load(object sender, EventArgs e)
{
//Binds CtlDdl here
}
当用户点击“保存”按钮时,控件会动态重新加载用户控件,但会选择用户在下拉列表中选择的值。我在这里遇到了鸡和蛋的问题。
我认为只有当它不是回发时才需要绑定ctlDdl,但这会导致下拉列表没有填充。
如果我每次绑定它,那么我将失去用户的选择
修改: 有人可以回应我对乔纳森答案的评论吗?感谢
答案 0 :(得分:0)
使用自定义控件,您必须管理状态。在国家传承的过程中会出现一种泡沫效应。如果你不处理它,你就不会得到状态。
此链接可帮助您入门:Server Control Custom State Management
寻找
Protected Overrides Sub LoadViewState( _
ByVal savedState As Object)
Dim p As Pair = TryCast(savedState, Pair)
If p IsNot Nothing Then
MyBase.LoadViewState(p.First)
CType(Author, IStateManager).LoadViewState(p.Second)
Return
End If
MyBase.LoadViewState(savedState)
End Sub
答案 1 :(得分:0)
只需覆盖用户控件中的OnInit方法,然后从该方法加载自定义控件即可。 ASP.NET在OnInit之后和PageLoad之前设置viewstate跟踪。因此,加载控件时设置的默认值被视图状态引擎视为更改,并在回发时被重置。
在viewstate上查看有关详细说明的文章:
http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx