2015-10-15 35 views
0

我有一些代碼包含一個面板,我從代碼隱藏中放置了一個ASP圖表。在面板下面,我放置了一個帶有回發事件的按鈕,該事件更改了該圖表的某些參數。添加UpdateProgress後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> 
... 

而後面的代碼:

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回傳停止工作。每當我點擊這個按鈕時,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: Could not find UpdatePanel with ID 'ctl00_Body_ctl02_udp_button'. If it is being updated dynamically then it must be inside another UpdatePanel.

顯然是由的UpdateProgress產生的JS被緩存。 UpdatePanel ID udp_button來自以前版本的代碼,它不再存在(我有UpdatePanel之外的按鈕,我用它自己的UpdatePanel封裝它以使UpdateProgress知道異步回發,在此之後example,現在我只是把它放在圖表的UpdatePanel中)。

清除瀏覽器緩存似乎不起作用(以及使用不同的瀏覽器)。


更新2:好了,我錯了。

udp_button是頁面上存在的另一個UpdatePanel,它在用戶控件中,我沒有注意到它。我將嘗試在UpdatePanel上放置一些條件UpdateMode,以查看是否可以阻止UpdateProgress更新錯誤的UpdatePanel。

+0

你是否得到任何客戶端JavaScript錯誤? – mason

+0

是的!我更新了問題 –

+0

我解決了它!感謝您的提示! –

回答

0

我做了我提到的更新2,它的工作!

顯然,由UpdateProgress控件生成的JavaScript代碼會嘗試更新受該異步回發影響的頁面上的所有UpdatePanel,並且無法找到位於Web用戶控件內的UpdatePanel(它用於查看的UpdatePanel面板與面板ClientID不匹配)。

解決方案:建立財產的UpdateMode =「條件」作爲Web用戶控件中的UpdatePanel,並使其更新程序的需要,只有當它。這樣,web用戶控件在由按鈕生成的異步回發期間不會更新,並且UpdateProgress的javascript不會嘗試找到它。

相關問題