UpdatePanel 中 ListView 中的 LinkButton 导致完全回发
Posted
技术标签:
【中文标题】UpdatePanel 中 ListView 中的 LinkButton 导致完全回发【英文标题】:LinkButton in ListView in UpdatePanel causes full postback 【发布时间】:2011-08-04 21:28:41 【问题描述】:我在 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>
我在 *** 上发现了另一篇建议添加以下内容的帖子:
protected void lvTargets_ItemDataBound(object sender, ListViewItemEventArgs e)
var lb = e.Item.FindControl("lnkAddTarget") as LinkButton;
tsm.RegisterAsyncPostBackControl(lb); // ToolkitScriptManager
这并没有什么不同...
还有一些其他类似的帖子,但我找不到解决方案!有什么想法吗?
【问题讨论】:
刚试过,谢谢。虽然没有运气。 :( 无论如何我都需要它有条件地更新。 尝试使用将更新面板的控件填充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】:尝试将CommandName
、CommandArgument
属性和OnCommand
事件处理程序添加到您的链接按钮,如下所示:
<asp:LinkButton CommandName='test' CommandArgument='<%# Eval("Title") %>' ID="lnkAddTarget" runat="server" OnCommand="LinkButtonCommandEventHandler" />
或者 - 将 OnItemCommand
处理程序添加到整个 ListView。
【讨论】:
感谢您的想法,但这并没有什么不同。【参考方案4】:我通过在适用页面的页面指令上设置:ClientIDMode="AutoID" 解决了这个问题,如下所示:<%@ Page Title="" ClientIDMode="AutoID" Language="C#"%>
,从而解决了我之前在 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 中的 LinkButton 导致完全回发的主要内容,如果未能解决你的问题,请参考以下文章
通过 Postback 在 UpdatePanel 中保留 DIV 的滚动位置
UpdatePanel 中的 FileUpload 控件而不刷新整个页面?
如何从 Gridview 中的 LinkButton 触发 Onclick 事件驻留在 updatePanel 中?