2009-09-22 62 views
0

我在使用javascript(jQuery)更新ASP:UpdatePanel时遇到问题。这是我的。ASP.NET:使用jQuery手动更新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> 

在处理该btnUpdate(在GridView RowCommand)的rptrEnquiry是反弹压btnUpdate当代码隐藏。

如果我直接按按钮(而不是隐藏的)一切完美(updateprogess显示和更新的日期和中继器更新。

但如果我点击消防链接,通过JavaScript触发按钮只有日期是更新,但是的UpdateProgress没有显示和转发不反弹。虽然我调试可以看到,反弹代码被执行,但它的效果是不是在更新。

回答

6

好吧,所以我通过彻底重建整个事情来解决我的问题。一些经验教训,可能会帮助别人:

我有一个gridview中的updatepanel时,我sepaarated更新面板部分到它自己的控制大部分我的问题解决了,如不being能够引用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(); 
    } 
} 

为了让__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> 
3

你有没有尝试过这样的事情?(摘自从Easily refresh an UpdatePanel, using JavaScript)。

there’s an easy method for triggering a postback targeted at the UpdatePanel: __doPostBack().

As long as the event target of a __doPostBack() call is an async trigger of an UpdatePanel, the ASP.NET AJAX framework will intercept the postback and fire a partial postback instead.

<a href="#" onclick="__doPostBack('<%= pnlUpdate.ClientID %>', '');"/> 
+0

我试过这种方法,但我有一个gridview中的updatepanel,这给了我“编译错误:pnlUpdate不在当前上下文”当试图获得ClientID – 2009-09-22 15:03:53

+0

有点奇怪,updatepanel是唯一的控件,我在gridview中,我可以'在当前的情况下找到? – 2009-09-22 15:11:51

+0

您必须将__doPostBack()锚标记放入与UpdatePanel相同的GridView模板中,才能看到pnlUpdate。 – jrummell 2009-09-22 15:46:56