我的印象是嵌套 UpdatePanel 中的控件将导致顶级 UpdatePanel 刷新(从而刷新两个 UpdatePanel),因为该控件上的任何事件都充当“隐式”触发器。那是对的吗?

我一直在尝试连接这样的东西-

UserControl

   Parent UpdatePanel

   "Show" button

      ASP:Panel

         Dynamically added UserControls, each with UpdatePanels

单击“显示”按钮时,ASP:Panel 变得可见,并开始根据某些后端逻辑动态地向其自身添加 UserControl。

每个动态添加的控件(以下称为 UserControl)都有自己的启用 Atlas 的按钮和链接,因此它们也有 UpdatePanel。目前,当我单击 UserControl 之一中的链接时,ASP:Panel 的全部内容都消失了,就好像它正在重新呈现一样。我所有动态添加的控件都消失了,并且调试器中没有捕获到它们的任何单击事件。

我假设这里发生的事情是驻留在嵌套更新面板中的控件导致父 UpdatePanel 回发,因为它们正在触发“隐式”触发器。有没有办法让我的 UserControls 自主运行而不与包含它们的 ASP:Panel 混淆?

如果没有,我应该在这里采取什么策略?如果每次在其中一个(可能是多个)UserControl 上发生事件时我都必须重新渲染整个 ASP:Panel,这意味着我将不得不重新创建 UserControl,这需要花费一些精力来创建。我还必须保留某种 View 状态来重新创建它们。我对 ASP.NET 有点陌生,这听起来很吓人。如果可以避免,我宁愿永远不要刷新顶级 UserControl 和 ASP:Panel,并让每个动态添加的 UserControl 异步触发和处理它们自己的事件。

编辑:我没有动态添加控件,而是将它们添加到标记中(不是一个糟糕的解决方案)。所以摆脱了控件消失的问题,因为现在控件不是动态添加的,而是存在于标记中。但是父 UpdatePanel 发布仍然是一个很大的性能损失,因为所有 UserControl 都被发布而不是一个。如何只进行一次 UserControl 回发?另外,我想知道如何解决动态添加控件消失的问题?

最佳答案

首先,请记住:UpdatePanel 不会改变页面的生命周期。

必须像正常回发生命周期一样重建所有控制树(包括 UpdatePanel)。1 2 UpdatePanel 确保仅返回渲染 (HTML) View 的一部分。删除所有 UpdatePanel 应该会导致相同的行为,除了完整的回发。例如,只有表示嵌套 UpdatePanel 的 HTML(大概是因为数据更改)可能会在 XHR 响应中发回。

要获得“真正的”AJAX,请考虑页面方法。或者,DevExpress(也许还有 Telerik 和其他人?)提供他们自己形式的“回调面板”,类似于 UpdatePanels,但可以绕过生命周期的一部分(因此通常不完全支持 ViewState 模型或者可能会介绍他们自己的怪癖)。

虽然不理解上述内容是控件“消失”的最可能原因,但这是我的规则: 不要让 [嵌套] 更新面板“自动”工作。

将遇到具有动态控件和嵌套 UpdatePanel 的边缘情况。可能有一个很好的方法来处理这个问题,但我在多次不同的尝试中都失败了。

相反,对于每个更新面板,运行:

UpdateMode="Conditional"
ChildrenAsTriggers="False"

使用“条件”更新模式,确保手动指定触发器控件或根据需要调用 panel.Update()(尽管这对控件进行了硬连线)。根据需要 ChildrenAsTriggers="True" 也可以工作。重要的是,UpdateMode 不是默认的“始终”。

切换到这种方法后,我对嵌套的 UpdatePanel 没有任何问题——嗯,几乎没有问题。

快乐编码!

1 如果在禁用部分渲染(在 ScriptManager 中)(例如,所有请求都是完整回发)的情况下页面无法正确呈现,则没有理由期望/相信它会与 UpdatePanels 一起正常工作。

2 有时需要在控件树中“欺骗”不会重新呈现的控件的昂贵重新计算。但是,我会考虑这些高级案例,只有在性能分析表明存在特定需求时才应该进行。

关于asp.net - 嵌套的 UpdatePanel 导致父级回发?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11166779/

10-17 02:23