【问题标题】:Dynamic user controls preserve state on postback动态用户控件在回发时保留状态
【发布时间】:2015-06-19 07:30:32
【问题描述】:

我很难面对 ASP.NET Web 窗体中的动态用户控件问题(我知道它们很糟糕,但我的项目依赖于它们)。简而言之,我的情况是:

  1. 我的 aspx 页面中有一个 DropDownList 有几个选项可供选择 from(对于每一个,我都有不同的用户控件来呈现);
  2. 当我选择一个时,此选项的用户控件将呈现在下方 UpdatePanel 内的占位符中:

  1. 在 DropDownList SelectedIndexChanged 方法后面的代码中,我使用 Page.LoadControl(string virtualPath) 创建用户控件的实例,然后将其添加到占位符的控件中:

    selectedFilters.Controls.Add(myUserControlObject);

第一个用户控件呈现正常,但是当我尝试将新用户控件添加到占位符时,第一个用户控件消失并且只呈现新用户控件。如何保留整个用户控件对象的状态,以便在回发期间它们不会丢失?

【问题讨论】:

标签: c# asp.net webforms


【解决方案1】:

您需要在每次回发时添加每个动态添加的控件,这通常最好在 Page_PreLoad 事件中完成,以便动态添加的控件将根据 ViewState 和发布的值返回到它的最后状态。

您可以使用 ViewState 来存储已添加的控件。你将如何做到这一点取决于你的情况,但它可能是这样的,当你动态添加一个控件时你会这样做:

ViewState["DynamicControl1"] = true;

然后在您的 Page_PreLoad 事件中...

if ((bool)ViewState["DynamicControl1"])
{
    //Add your control again here,
    //possibly duplicated from your DropDownList SelectedIndexChanged handler
}

根据您的 ViewState 设置,只要在页面生命周期的正确部分添加控件,ASP.NET 就会自动重新填充您的 DropDownList 项目列表和选定值。如果您禁用了 ViewState,那么当您在 Page_PreLoad 事件中添加控件时,您将需要重新填充列表项。

请注意,动态添加的控件在每次回发时具有相同的 ID 非常重要,因此如果您遇到问题,请尝试将 ClientIDMode 设置为“AutoID”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多