添加UpdateProgress

时间:2015-10-15 17:23:55

标签: asp.net ajax updatepanel updateprogress

我有一些代码包含一个面板,我在其中放置了代码隐藏的ASP图表。在面板下方,我放置了一个带有回发事件的按钮,该事件会更改该图表的某些参数。

以下是代码的简化版本:

...
<asp:UpdatePanel ID="udp" runat="server">
  <ContentTemplate>
    <asp:Panel ID="pnl_chart" runat="server" />
    <asp:Button ID="btn_chart" UseSubmitBehavior="false" runat="server" />
  </ContentTemplate>
</asp:UpdatePanel>
...

背后的代码:

Private Property AltChart As Boolean
  Get
    If Me.ViewState("simulador_avanzado") Is Nothing Then
      Return False
    End If
    Return ToBool(Me.ViewState("simulador_avanzado"))
  End Get
  Set(value As Boolean)
    Me.ViewState("simulador_avanzado") = value
  End Set
End Property    

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ...
  If IsPostBack AndAlso ToStr(Me.Request("__EVENTTARGET")).Contains("btn_chart") Then
    AltChart = Not AltChart
  End If

  Dim cht as New Chart
  'Build the chart...'
  pnl_chart.Controls.Add(cht)
  ...
End Sub

这就像一个魅力,但当我添加一个UpdateProgress时,PostBack停止工作。每当我单击该按钮时,UpdateProgress都会显示2-3秒(确切地说是返回PostBack所需的内容)但是它会隐藏并且UpdatePanel内容不会被刷新。

这是新代码:

...
<asp:UpdatePanel ID="udp" runat="server">
  <ContentTemplate>
    <asp:Panel ID="pnl_chart" runat="server" />
    <asp:Button ID="btn_chart" UseSubmitBehavior="false" runat="server" />
  </ContentTemplate>
</asp:UpdatePanel>

<asp:UpdateProgress ID="udpro" AssociatedUpdatePanelID="udp" DynamicLayout="false" runat="server">
  <ProgressTemplate>
    <div class="udp_progress">
    </div>
  </ProgressTemplate>
</asp:UpdateProgress>
...

我调试了部分回发,后面的代码按预期工作,它更新 AltChart 变量和图表本身。

简单来说:UpdatePanel部分回发效果很好,但是当我添加一个绑定到它的UpdateProgress时,它的内容不会在部分回发上更新。

更新:我收到了下一个客户端错误:

  

SCRIPT5022:Sys.InvalidOperationException:找不到ID为&#39; ctl00_Body_ctl02_udp_button&#39;的UpdatePanel。如果它是动态更新的,那么它必须在另一个UpdatePanel内。

显然,正在缓存UpdateProgress生成的js。 ID为 udp_button 的UpdatePanel来自代码的先前版本,它不再存在(我在UpdatePanel外面有一个按钮,我用自己的UpdatePanel包装它以使UpdateProgress知道在example之后的异步回发,现在我只是把它放在图表的UpdatePanel中。

清除浏览器缓存似乎不起作用(以及使用其他浏览器)。

更新2:好的,我错了。

udp_button 是页面上的另一个UpdatePanel,它位于用户控件中,我没有注意到它。我将尝试在两个UpdatePanel上放置一些条件UpdateMode,以查看是否可以阻止UpdateProgress更新错误的UpdatePanel。

1 个答案:

答案 0 :(得分:0)

我做了我在更新2 上提到的内容,但它确实有效!

显然,UpdateProgress控件生成的javascript代码尝试更新受异步回发影响的页面上的所有UpdatePanel,并且无法找到Web用户控件内的UpdatePanel(它正用于的ID)寻找面板与面板ClientID不匹配。

解决方案:为Web用户控件中的UpdatePanel建立属性 UpdateMode =&#34;条件&#34; ,并使其仅在&#39时更新;需要的。这样,在按钮生成的异步回发期间,Web用户控件不会更新,并且UpdateProgress&#39; javascript并没有尝试找到它。