【问题标题】:Custom Server Control causes full postbacks inside of UpdatePanel自定义服务器控制导致 UpdatePanel 内的完整回发
【发布时间】:2010-10-30 19:23:18
【问题描述】:

我有一个自定义服务器控件,在我将它放入更新面板之前它似乎可以正常工作。一旦进入 UpdatePanel,它会继续正常工作,但是当我的自定义服务器控件执行回发时,UpdatePanel 现在会执行完整回发。

我是否需要做任何事情来让我的自定义服务器控件在 UpdatePanel 中执行异步回发?

这是导致完整回发的相关代码。 ecs:Pager 控件是我的自定义控件,即使它在 UpdatePanel 中也会导致 OnCommand 事件的完整回发。

<asp:UpdatePanel ID="ClosedIssuesUpdatePanel" runat="server">
    <ContentTemplate>
        <ecs:Pager ID="ClosedIssuesPager" OnCommand="ClosedIssuesPager_Command" runat="server" />
        <asp:Repeater ID="ClosedIssuesRepeater" runat="server">
        ....
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

【问题讨论】:

  • 我也会对这个问题的答案感兴趣。我有一个实现 IPostBackDataHandler 的自定义控件,它不会在 UpdatePanel 中执行部分回发。当您使用 UseChildrenAsTriggers 属性时,必须有一些秘密使控件注册为触发器。
  • 如果您在更新面板上添加显式触发器以对自定义控件的事件进行异步回发,会发生什么情况?

标签: .net asynchronous updatepanel postback custom-server-controls


【解决方案1】:

将更新面板的更新模式设置为条件。

<asp:UpdatePanel ID="ClosedIssuesUpdatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <ecs:Pager ID="ClosedIssuesPager" OnCommand="ClosedIssuesPager_Command" runat="server" />
        <asp:Repeater ID="ClosedIssuesRepeater" runat="server">
        ....
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

【讨论】:

    【解决方案2】:

    您没有指定自定义控件中使用的控件类型。它们是按钮还是下拉菜单或其他东西?如果它们是按钮,则需要确保它们的 UseSubmitBehavior 属性设置为 False。

    此外,您还需要通过ScriptManager.RegisterAsyncPostBackControl 向页面的 ScriptManager 注册您的控件

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,发现在我的用户控件标签中添加属性 ClientIDMode="AutoID" 解决了这个问题。

      【讨论】:

        【解决方案4】:

        抱歉...看不到页面的其余部分。

        您的页面上也有 ScriptManager 吗?

        【讨论】:

        • 是的,很抱歉代码由于某种原因被截断了。现在修好了。 ScriptManager 是母版页的一部分。
        【解决方案5】:

        自定义控件是否实现 INamingContainer,回发是否来自该命名容器内的另一个控件?

        我发现 UpdatePanel 和源代码管理之间的命名容器边界会导致这种行为。

        【讨论】:

          【解决方案6】:

          一个选项可能是 AndreasKnudsen 建议的将 AsyncPostBackTrigger 添加到您的面板

          <asp:UpdatePanel ID="ClosedIssuesUpdatePanel" runat="server">
            <ContentTemplate>
              <ecs:Pager ID="ClosedIssuesPager" OnCommand="ClosedIssuesPager_Command" runat="server" />
              <asp:Repeater ID="ClosedIssuesRepeater" runat="server">
                ....
              </asp:Repeater>
            </ContentTemplate>
            <Triggers>
              <AsyncPostBackTrigger ControlID="ClosedIssuesPager" EventName="Command" />
            </Triggers>
          </asp:UpdatePanel>
          

          另一种选择是尝试将 ChildrenAsTriggers 添加到您的 UpdatePanel 标记中

          <asp:UpdatePanel ID="ClosedIssuesUpdatePanel" runat="server" ChildrenAsTriggers="true">
          

          【讨论】:

          • ChildrenAsTriggers 默认为 true,因此添加它不会有任何不同。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多