我在使用javascript(jQuery)更新ASP:UpdatePanel时遇到问题.这就是我的意思.
我正在使用隐藏的按钮技巧,因为我似乎无法获得__doPostBack技巧的更新面板的ClientID.
<asp:UpdatePanel runat="server" ID="pnlUpdate">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnUpdate" />
</Triggers>
<ContentTemplate>
<asp:UpdateProgress runat="server" AssociatedUpdatePanelID="pnlUpdate" DynamicLayout="false" DisplayAfter="100">
<ProgressTemplate>
<img alt="Laddar..." src="img/loader.gif" width="16" height="11"/>
</ProgressTemplate>
</asp:UpdateProgress>
<div style="display:none;">
<asp:Button runat="server" ID="btnUpdate" CommandName="Refresh" CommandArgument='<%# Eval("Id") %>'/>
</div>
<asp:Repeater runat="server" Id="rptrEnquiry">
...
</asp:Repeater>
<%= DateTime.Now.ToString() %>
<a href="javascript:jQuery('#<%= btnUpdate.ClientID %>').trigger('click')&&undefined;">Fire!</a>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
在处理btnUpdate的代码隐藏中(在GridView RowCommand中),当按下btnUpdate时,rptrEnquiry会反弹.
如果我直接按下按钮(虽然没有隐藏)一切都很完美(显示更新程序并更新日期并更新转发器.
但是,如果我单击fire link并通过javascript触发按钮,则只更新日期,但不显示updateprogress,并且转发器不会反弹.在调试时我可以看到反弹代码已经执行,但它的效果不在更新中.
好的,所以我通过完全重建整个事情来解决我的问题.可以帮助其他人的一些经验教训:
我在gridview中有更新面板,当我将updatepanel部分分成一个控件时,我自己的大多数问题都解决了,例如无法引用pnlUpdate.
http://encosia.com/2007/10/24/are-you-making-these-3-common-aspnet-ajax-mistakes/非常有帮助.
更新面板中的更新由其PreRender控制.通过使用__EVENTTARGET,我们感兴趣的面板就会更新.
protected void pnlUpdate_PreRender(object sender, EventArgs args)
{
if (Request["__EVENTTARGET"] == pnlUpdate.ClientID)
{
PreBind();
switch(Request["__EVENTARGUMENT"])
{
case "toggle":
Toggle();
break;
case "purchase":
Purchase();
break;
case "update":
/* nop */
break;
}
Bind();
}
}
Run Code Online (Sandbox Code Playgroud)
要使__EVENTTARGET具有正确的clientId(如果使用按钮,则为空字符串)我需要使用javascript触发面板更新:
<a href="javascript:__doPostBack('<%= pnlUpdate.ClientID %>','toggle');">
<img runat="server" ID="imgToggle" src="~/img/grid_plus.gif" title="Expandera" alt="" width="14" height="14"/>
</a>
Run Code Online (Sandbox Code Playgroud)