添加 UpdateProgress 后 UpdatePanel 中断
UpdatePanel breaks after adding 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: 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。 ID 为 udp_button 的 UpdatePanel 来自以前版本的代码,它不再存在(我在 UpdatePanel 外面有按钮,我用自己的 UpdatePanel 包装它以制作UpdateProgress 知道异步回发,在这个 example 之后,现在我只是将它放在图表的 UpdatePanel 中)。
清除浏览器缓存似乎不起作用(以及使用不同的浏览器)。
更新 2: 好的,我错了。
udp_button 是页面上出现的另一个 UpdatePanel,它位于用户控件内,我没有注意到它。我将尝试在两个 UpdatePanel 上放置一些有条件的 UpdateModes,看看我是否可以防止 UpdateProgress 更新错误的 UpdatePanel。
我做了我在 更新 2 中提到的,并且成功了!
显然,由 UpdateProgress 控件生成的 javascript 代码试图更新页面上受异步回发影响的所有 UpdatePanel,但找不到 Web 用户控件(ID它用于查找与面板 ClientID 不匹配的面板。
解决方法:为web用户控件内的UpdatePanel设置属性UpdateMode="Conditional",并使其仅在需要时更新。这样,在按钮生成的异步回发期间不会更新 Web 用户控件,并且 UpdateProgress'javascript 不会尝试找到它。
我有一些代码包含一个面板,我在其中放置了来自代码隐藏的 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: 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。 ID 为 udp_button 的 UpdatePanel 来自以前版本的代码,它不再存在(我在 UpdatePanel 外面有按钮,我用自己的 UpdatePanel 包装它以制作UpdateProgress 知道异步回发,在这个 example 之后,现在我只是将它放在图表的 UpdatePanel 中)。
清除浏览器缓存似乎不起作用(以及使用不同的浏览器)。
更新 2: 好的,我错了。
udp_button 是页面上出现的另一个 UpdatePanel,它位于用户控件内,我没有注意到它。我将尝试在两个 UpdatePanel 上放置一些有条件的 UpdateModes,看看我是否可以防止 UpdateProgress 更新错误的 UpdatePanel。
我做了我在 更新 2 中提到的,并且成功了!
显然,由 UpdateProgress 控件生成的 javascript 代码试图更新页面上受异步回发影响的所有 UpdatePanel,但找不到 Web 用户控件(ID它用于查找与面板 ClientID 不匹配的面板。
解决方法:为web用户控件内的UpdatePanel设置属性UpdateMode="Conditional",并使其仅在需要时更新。这样,在按钮生成的异步回发期间不会更新 Web 用户控件,并且 UpdateProgress'javascript 不会尝试找到它。