我有一个自定义用户控件 ascx,它公开了一个简单的属性
/// <summary>
/// The currently selected ID, if there is one
/// </summary>
public virtual int? SelectedId
{
get { return (int)ViewState["XXID"]; }
set { ViewState["XXID"] = value; }
}
该控件位于 PlaceHolder 内,并且该值在 PlaceHolder 下方按钮的回发 onclick 方法中读取得很好。
但是,如果 PlaceHolder visible=false 则 ViewState["XXID"] 返回 null。如果我切换 PlaceHolder visible=true 那么值会返回。
<asp:PlaceHolder runat="server" ID="plcCustomer" >
<my:CustomPicker runat="server" ID="cboCustomer" />
</asp:PlaceHolder >
<asp:Button runat="server" ID="btnToggleVisible" onclick="btnToggleVisible_OnClick" text="Toggle visible" />
<asp:Button runat="server" ID="btnGetSelectedId" onclick="btnGetSelectedId_OnClick" text="Get Value" />
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
plcCustomer.SelectedId = 5;
}
protected void btnToggleVisible_OnClick(object sender, EventArgs e)
{
plcCustomer.Visible = !plcCustomer.Visible;
}
protected void btnGetSelectedId_OnClick(object sender, EventArgs e)
{
...
plcCustomer.SelectedId //<== this will be null whenever plcCustomer is invisible
...
}
我有一种预感,页面并没有打扰加载我的控件的视图状态,因为它不会是可见的。
如果是这样,我如何指示页面它应该加载自定义控件的视图状态,即使它们位于隐藏的 PlaceHolder 中?