在UpdatePanel中的ListView中使用LinkButton会导致完整的页面回发。

28

我在一个UpdatePanel中的ListView里面有一个LinkButton。我想让这个按钮(或者所有的按钮)引起部分页面回传,但它们会引起整个页面回传。

<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>

我在stackoverflow上找到另一篇帖子,建议添加以下内容:

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

还没有任何改变...

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


刚刚尝试了一下,谢谢。不过没有成功。 :( 无论如何我需要有条件地更新它。 - James
我该怎么做?'lnkAddTarget'在ListView外不可见。谢谢。 - James
5
我最终需要在页面指令中设置ClientIDMode="AutoID"。我不知道为什么,但它起作用了!希望这能帮助下一个遇到同样问题的人。 - James
2
我建议您将最后的评论添加为“答案”,这样未来的搜索者就会更容易找到它 :) - Alex from Jitbit
1
我遇到了同样的问题,但是我通过使用OnItemCreated而不是OnItemDataBound来使其正常工作,而无需使用AutoID。显然,如果您使用第二个选项,则UpdatePanel仅适用于一个异步后台操作!第二次尝试将始终导致完全后台操作,我不知道为什么... - GtEx
显示剩余2条评论
5个回答

38

ASP.NET 4中的ClientIDMode设置允许您指定ASP.NET为HTML元素生成id属性的方式。

在之前的ASP.NET版本(即4以前),默认行为相当于ClientIDMode的AutoID设置。然而,现在的默认设置是可预测的(Predictable)。

阅读Microsoft文章

由于脚本管理器期望在先前的.NET版本中生成HTML控件的方式,因此需要使用AutoID。


1
谢谢。这让我疯了半天。就我所尝试的,我必须给链接按钮放一个ID,并在页面指令中放置AutoID。 - Larry
1
半天?我已经在这上面工作了一周多...我以为肯定是我的UpdatePanel或者其他奇怪的控件出了问题。结果发现只是我的LinkButton.. 哎... - Rob
1
谢谢你,好伙计。我从 DataList 切换到 ListView 后,突然间无法使用 UpdatePanel 了。 - Dogoku
4
非常感谢!我在asp:ListView...中添加了ClientIDMode="AutoID"属性,问题已解决!+1 - Lukas

1
我通过在适用页面的页面指令中设置ClientIDMode="AutoID"来解决了这个问题。
<%@ Page Title="" ClientIDMode="AutoID" Language="C#"%>

这个工作正常。

0

尝试像这样向您的链接按钮添加CommandNameCommandArgument属性和OnCommand事件处理程序:

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

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


谢谢您的想法,但这并没有什么区别。 - James

0
我通过在适用页面的页面指令上设置ClientIDMode="AutoID"来解决了这个问题,如下所示:<%@ Page Title="" ClientIDMode="AutoID" Language="C#"%>,从而解决了我的以前的问题,即在ListView中有一个ASP链接按钮会导致完全的postback。
然而,这可能需要在客户端代码(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; });

0
我通过在适用页面的页面指令上设置ClientIDMode="AutoID"来解决了这个问题,例如:<% @Page Title="" ClientIDMode="AutoID" Language="C#" %>。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接