【问题标题】:ASP.NET Controls and Update PanelsASP.NET 控件和更新面板
【发布时间】:2010-10-08 14:35:29
【问题描述】:

我正在动态创建一系列嵌套在更新面板中的客户端组件控件。第一次创建控件时,一切正常,但是,当我在更新面板上触发更新并执行部分回发时,控件返回几个 javascript 错误,描述控件是如何在页面上注册的。

我收到了一系列错误,例如: “错误:Sys.InvalidOperationException:无法将具有相同 id “master_ctl40_CCB_PALETTES”的两个组件添加到应用程序中”

有什么想法吗?

【问题讨论】:

  • 听起来您尝试创建控件两次。你能发布你的更新代码吗?您在哪里创建控件?

标签: asp.net events controls updatepanel custom-server-controls


【解决方案1】:

看起来您的客户端对象被创建了不止一次。

如果您希望在刷新更新面板时替换您的客户端控件,它们应该从 Sys.UI.Control 继承,后者在其构造函数中采用一个元素。当该元素被更新面板替换时,客户端对象将被释放然后重新创建。如果您当前在服务器端使用 ScriptComponentDescriptor 来定义客户端控件实例,则需要切换到 ScriptControlDescriptor。

听上去,您的客户端对象只是从 Sys.Component 继承而来,它会一直挂起,直到它们被手动处置,这就是为什么您会收到一个关于拥有多个具有相同 ID 的组件的错误的原因。

我建议不要在每次回帖时都使用新 ID - 这只会继续创建新的客户端对象,而不会清理旧的。

【讨论】:

    【解决方案2】:

    试试这些技巧:

    1. 在 Page_Load 上放置 uxFailedControl.ID = DateTime.Now.ToString();它将确保您的控件在每次页面重新加载(全部或部分)时都具有唯一 ID,因此理论上您不应再看到“相同 id”错误。
    2. 如果您在 Modal Popup 中显示控件:每次从服务器隐藏弹出窗口时,从其容器(面板、页面、控件等)中删除控件。使用 uxModalPopupPanel.Controls.Clear();或 uxModalPopupPanel.Remove(uxFailedControl);
    3. 完成调试后,将 ScriptManager 的 ScriptMode 属性设置为“Release”。它将防止内部 AJAX 异常冒泡到浏览器。

    【讨论】:

    • 使用 DateTime.Now.ToString() 生成唯一 ID 可以解决我的问题。
    【解决方案3】:

    在哪种情况下您将组件添加到更新面板? IE。您是否将它们放置在页面加载事件中而没有进行回发检查,或者是否将它们放置在更新面板加载事件中?等等……

    【讨论】:

    • 是的,我将它们添加到 Page_Load 事件中,但是,如果我说 if(!Page.IsPostBack) 之后控件不会更新或发送到客户端。跨度>
    • 您能否尝试在 Page_Init 事件中添加您的控件并删除 IsPostBack 代码块。
    猜你喜欢
    • 2014-01-28
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多