UpdatePanel 中 ListView 中的 LinkBut​​ton 导致完全回发

Posted

技术标签:

【中文标题】UpdatePanel 中 ListView 中的 LinkBut​​ton 导致完全回发【英文标题】:LinkButton in ListView in UpdatePanel causes full postback 【发布时间】:2011-08-04 21:28:41 【问题描述】:

我在 UpdatePanel 的 ListView 中有一个 LinkBut​​ton。我希望按钮(嗯,其中任何一个)导致部分回发,但它们会导致整页回发。

<asp:UpdatePanel ID="upOutcomes" UpdateMode="Conditional" runat="server">
  <ContentTemplate>
      <asp:ListView ID="lvTargets" runat="server" onitemdatabound="lvTargets_ItemDataBound">
        <ItemTemplate>
          <asp:LinkButton ID="lnkAddTarget" CssClass="lo" Text='<%# Eval("Title") + " <b>" + Eval("Level") + Eval("SubLevel") + "</b>" %>' runat="server"></asp:LinkButton>
        </ItemTemplate>
      </asp:ListView>
  </ContentTemplate>
</asp:UpdatePanel>

我在 *** 上发现了另一篇建议添加以下内容的帖子:

protected void lvTargets_ItemDataBound(object sender, ListViewItemEventArgs e) 
  var lb = e.Item.FindControl("lnkAddTarget") as LinkButton;
  tsm.RegisterAsyncPostBackControl(lb);  // ToolkitScriptManager

这并没有什么不同...

还有一些其他类似的帖子,但我找不到解决方案!有什么想法吗?

【问题讨论】:

刚试过,谢谢。虽然没有运气。 :( 无论如何我都需要它有条件地更新。 尝试使用将更新面板的控件填充 集合,即使该控件位于面板内。 我最终需要在 Page 指令中设置 ClientIDMode="AutoID"。不知道为什么——但它奏效了!我希望这可以帮助下一个遇到此问题的人。 我建议您将最后一条评论添加为“答案”,这样以后的搜索者会发现它更容易:) 我遇到了同样的问题,我通过使用OnItemCreated 而不是OnItemDataBound 使其在没有AutoID 的情况下工作。显然,如果您使用第二个,则 UpdatePanel 仅适用于一个异步回发!第二次尝试总是会导致完整的回发,我不知道为什么...... 【参考方案1】:

ASP.NET 4 中的 ClientIDMode 设置允许您指定 ASP.NET 如何为 html 元素生成 id 属性。

在以前的 ASP.NET 版本(即 pre 4)中,默认行为等同于 ClientIDMode 的 AutoID 设置。但是,默认设置现在是可预测的

Read Microsoft Article

由于脚本管理器希望在以前版本的 .NET 中生成 HTML 控件的方式,因此需要 AutoId。

【讨论】:

谢谢。这让我疯了半天。就我而言,我必须为链接按钮添加一个 ID,并将 AutoID 放入页面指令中。 半天?我已经为此工作了一个多星期.. 我确定这是我的 UpdatePanel 或我正在使用的其他一些古怪的控件。原来这只是我的链接按钮.. gaah... 谢谢我的好人。我从 DataList 切换到 ListView,但无法弄清楚为什么我的 UpdatePanel 突然停止工作 非常感谢!在 中添加了 ClientIDMode="AutoID" 作为属性,已修复! +1【参考方案2】:

我通过在适用页面的页面指令上设置:ClientIDMode="AutoID" 解决了这个问题,如下所示:

<%@ Page Title="" ClientIDMode="AutoID" Language="C#"%>

这工作正常。

【讨论】:

【参考方案3】:

尝试将CommandNameCommandArgument 属性和OnCommand 事件处理程序添加到您的链接按钮,如下所示:

<asp:LinkButton CommandName='test' CommandArgument='<%# Eval("Title") %>' ID="lnkAddTarget" runat="server" OnCommand="LinkButtonCommandEventHandler" />

或者 - 将 OnItemCommand 处理程序添加到整个 ListView。

【讨论】:

感谢您的想法,但这并没有什么不同。【参考方案4】:

我通过在适用页面的页面指令上设置:ClientIDMode="AutoID" 解决了这个问题,如下所示:&lt;%@ Page Title="" ClientIDMode="AutoID" Language="C#"%&gt;,从而解决了我之前在 ListView 中有一个 ASP 链接按钮导致完整回发的问题。

但是,这可能要求客户端代码(Jquery、javascript)上的任何 ASP 控件都使用其在浏览器源代码中出现的全名(我在 Firefox 中使用 Firebug 来获取名称)。比如这个jquery函数$("#ContentPlaceHolder1_btnCancelReferCustomer").click(function () $("#divRefer").hide( effect: "slide", duration: 200 ); return false; ); 改成了这个(请注意选择器中的 asp 按钮名称更改): $("#ctl00_ContentPlaceHolder1_btnCancelReferCustomer").click(function () $("#divRefer").hide( effect: "slide", duration: 200 ); return false; );

【讨论】:

【参考方案5】:

我通过在适用页面的页面指令上设置:ClientIDMode="AutoID" 解决了这个问题,如下所示:

【讨论】:

以上是关于UpdatePanel 中 ListView 中的 LinkBut​​ton 导致完全回发的主要内容,如果未能解决你的问题,请参考以下文章

如何访问包含在中继器中的 Listview 中的按钮?

UpdatePanel 中的 JavaScript 代码

通过 Postback 在 UpdatePanel 中保留 DIV 的滚动位置

UpdatePanel 中的 FileUpload 控件而不刷新整个页面?

如何从 Gridview 中的 LinkBut​​ton 触发 Onclick 事件驻留在 updatePanel 中?

UpdatePanel 中的复选框列表在选中项目时触发完整的回发