【问题标题】:Can't update a second update panel无法更新第二个更新面板
【发布时间】:2010-07-16 14:14:13
【问题描述】:

我的页面上有 3 个更新面板,我希望在触发事件时更新其中的 2 个。在其中一个更新面板中,我有一个 asp ReoderList。

<asp:UpdatePanel ID="upMain" UpdateMode="Conditional" runat="server" style="left: 0px; top: 0px; min-height: 100px; width: 495px; overflow: auto;">
                <ContentTemplate>
                    <div class="reorderListDemo" style="position: relative; left: -41px; width: 490px; overflow: auto;">
                        <ajax:ReorderList ID="rlAlerts" Style="min-height: 100px; padding: 0px 6px 0px 0px;" Width="480px" runat="server" PostBackOnReorder="false" CallbackCssStyle="callbackStyle" DragHandleAlignment="Left" DataKeyField="ItemID" SortOrderField="Priority" OnItemReorder="rlAlerts_ItemReorder">
                            <ItemTemplate>
                                <%--set the class to inactiveAlert if the active flag is set to false--%>
                                <div id="alertItem<%# Eval("ItemID")%>" class="<%# Convert.ToBoolean(Eval("Active")) ? "" : "inactiveAlert" %>" onclick="updateAlertPreview('<%# Eval("ItemID")%>','<%# Eval("Priority")%>','<%# Eval("Title") %>','<%# Eval("Description") %>', '<%# Eval("StartDate") %>', '<%# Eval("EndDate")  %>', '<%# Eval("Image") %>');">
                                    <div style="position: relative; float: left; left: 10px; padding-top: 6px; overflow: hidden; width: 180px; height: 17px;">
                                        <asp:Label ID="Label4" runat="server" Text='<%# HttpUtility.HtmlEncode(Convert.ToString(Eval("Title"))) %>' />
                                    </div>
                                 </div>
                            </ItemTemplate>
                            <ReorderTemplate>
                                <asp:Panel ID="Panel2" runat="server" CssClass="reorderCue" />
                            </ReorderTemplate>
                            <DragHandleTemplate>
                                <div class="dragHandle">
                                </div>
                            </DragHandleTemplate>
                        </ajax:ReorderList>
                    </div>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="rlAlerts" EventName="ItemReorder" />
                    <asp:AsyncPostBackTrigger ControlID="ckbxShowInactive" EventName="CheckedChanged" />
                </Triggers>
            </asp:UpdatePanel>

目前,此更新面板将更新项目重新排序或复选框状态更改。 现在我有了第二个 updatePanel,它在重新排序列表时不会更新。

<asp:UpdatePanel ID="UpdatePanelAlertOrderNotification" UpdateMode="Conditional" runat="server">
                    <ContentTemplate>
                        <asp:Label ID="lblOrderChangedNotification" runat="server"></asp:Label>
                    </ContentTemplate>
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="rlAlerts" EventName="ItemReorder" />
                    </Triggers>
                </asp:UpdatePanel>

这是我的代码:

    protected void rlAlerts_ItemReorder(object sender, AjaxControlToolkit.ReorderListItemReorderEventArgs e)
        {
           .....
           Session["AlertOrderChangedNotification"] = Resources.LocalizedText.Alert_Order_Changed;

            lblOrderChangedNotification.Text = "AWESOME";
            //lblOrderChangedNotification.DataBind();
            //UpdatePanelAlertOrderNotification.Update();
}

我已经单步执行了代码,但我不知道为什么它不起作用。

我厌倦的事情: 我累了: 将 UpdatePanelAlertOrderNotification 的 UpdateMode 设置为始终。 将 UpdatePanelAlertOrderNotification 的 UpdateMode 设置为 Conditional,删除其触发器并让函数后面的代码更新 直接更新面板。 将文本存储在会话中,并在页面发布触发时检查会话中是否有文本。我可以在 pageLoad 中跳过这段代码 功能,它仍然没有做任何事情。 (尝试将两行都注释掉,然后只用 1 行,然后没有任何注释掉。)

protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["AlertOrderChangedNotification"] != null)
            {
                lblOrderChangedNotification.Text = Session["AlertOrderChangedNotification"] as string;
                //lblOrderChangedNotification.DataBind();
                //UpdatePanelAlertOrderNotification.Update();
            }
        }

我不知道我是否遇到了问题,因为我有两个具有相同触发器的更新面板(即使 我尝试将其从 UpdatePanelAlertOrderNotification 中删除并将其设置为始终。)

变化: 所以我尝试添加一个新按钮并让更新面板更新。这行得通。如果我将触发器切换回重新排序列表,它将不起作用。所以我的问题是,我可以有 2 个具有相同触发器的不同 updatePanel 吗?如果我不能,我应该能够通过调用 UpdatePanelAlertOrderNotification.Update() 来获得一个损坏的更新??想法?

<div style="position: absolute; top: 195px; right: 10px; height: 100px; width: 120px; overflow: hidden;">
                    <asp:UpdatePanel ID="UpdatePanelAlertOrderNotification" UpdateMode="Conditional" runat="server">
                        <ContentTemplate>
                            <asp:Label ID="lblOrderChangedNotification" runat="server"></asp:Label>
                        </ContentTemplate>
                        <Triggers>
                            <%--<asp:AsyncPostBackTrigger ControlID="rlAlerts" EventName="ItemReorder" />--%>
                            <asp:AsyncPostBackTrigger ControlID="btnUpdateBrokenUpdatePanel" EventName="Click" />
                        </Triggers>
                    </asp:UpdatePanel>
                    <div style="position: relative; top: 25px; left: 10px;">
                        <asp:Button ID="btnUpdateBrokenUpdatePanel" runat="server" CssClass="redButton" Width="300px" Height="25px" Text="Update Broken UPdatePanel" OnClick="btnUpdateBrokenUpdatePanel_Click" />
                    </div>

任何帮助都会很棒。 谢谢布拉德

【问题讨论】:

  • 也许与此有关? UpdateMode="Conditional" 为什么不设置为 always?
  • 我确实一直有它,但它仍然没有更新。

标签: c# asp.net updatepanel


【解决方案1】:

我猜你遇到了更新面板没有得到适当通知的问题,我会使用条件触发器设置包装面板,然后让它在其他两个面板上调用更新方法。

您要确保的一件事是,实际更新这些项目的显示的代码也会被执行。

【讨论】:

  • 我同意 UpdatePanelAlertOrderNotification 没有更新/收到正确的通知。我不知道为什么不是。我很困惑 - “我会使用条件触发器设置包装”,您的意思是添加 > 到 UpdatePanelAlertOrderNotification ?
【解决方案2】:

您遇到的问题是控件 rlAlerts 位于第一个更新面板的内容模板中,当您在第二个更新面板中定义异步触发器时,它不知道 rlAlerts 因为它已预先添加了第一个更新面板的命名容器更新面板。

尝试以下方法之一:

  • 如果可能的话,将 rlAlerts 放在更新面板之外
  • 在 ItemReorder 事件处理程序后面的代码中显式调用 UpdatePanelAlertOrderNotification.Update()。听起来你已经尝试过但它不起作用,这很奇怪
  • 在预渲染中为第二个更新面板显式注册代码背后的触发器:

    UpdatePanelAlertOrderNotification.Triggers.Add(new AsyncPostBackTrigger() {ControlID = rlAlerts .UniqueID, EventName = "ItemReorder"});

【讨论】:

  • 1 - 我无法移动 rlAlerts。 2 - 不确定什么不起作用 3 - 试过这个。好主意,但没有运气。然后,我还尝试输入无效的 ControlID,页面抛出错误,提示找不到控件。所以它一定找到了。
  • 这很奇怪。我想这需要一些时间来解决它,并且如果没有实际在环境中并对其进行调试,将很难提供帮助。如果您绝望,这是我的解决方法建议。在第二个更新面板中添加一个隐藏按钮,例如 btnHidden 并使用虚拟方法将其连接起来。然后在 ItemReorder 方法中,您将执行 ScriptManager.RegisterStartupScript(............, "__doPostback('" + btnHidden.UniqueID + "', '')", true);不确定您是否应该使用 UniqueID 或 ClientID,但其中一个应该可以工作。这基本上迫使另一个回发到第二个更新面板
  • 是个好主意。它是一个黑客,但它应该工作。我会告诉你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2021-02-23
相关资源
最近更新 更多