更新面板内部回发问题

Postback inside update panel issue

我在最初隐藏的更新面板中有一个面板。 When a row inside a grid is selected this panel is made visible with details of selected record.

在这个面板中,我有一个下拉列表,它执行回发以设置标签的文本。当回发发生时,面板再次变得不可见。我尝试为更新面板设置触发器并将其设置为下拉列表的 slectedindexchanged 事件但没有用。我将这个更新面板放在另一个更新面板中,但没有成功。

<asp:UpdatePanel runat="server" ID="upnlDetail" RenderMode="Inline">
    <ContentTemplate>
        <asp:Panel runat="server" ID="pnlDetail" style="display:none">
            <asp:DropDownList runat="server" 
                ID="ddlIDSID" 
                AutoPostBack="true" 
                DataSourceID="odsIDS" 
                DataTextField="IDSNAME_BK" 
                DataValueField="IDSID" 
                OnSelectedIndexChanged="ddlIDSID_SelectedIndexChanged">
            </asp:DropDownList>
            <asp:Label runat="server" ID="lblIDSSite" CssClass="NormalSmall" />
        </asp:Panel>
    </ContentTemplate>        
</asp:UpdatePanel>

选择网格后,我使用 javascript 填充控件并使面板可见:

function populate(record) {
    var oDetailPanel = document.getElementById('<%=pnlDetail.ClientID %>');
    /* set up all controls  */
    oDetailPanel.style.display = "block";
}

您可能会在调用页面加载时解决您的问题:

if(Page.IsPostback)
     pnContent.Visible = true;

您可能必须执行 IsAjaxPostBack 我认为是通过脚本管理器。

以下是我反对更新面板的原因。


简而言之,尽管仍使用 更新面板,但此问题的解决非常 复杂。您应该改用自己的 Ajax。

问题本身很常见。 超文本传输​​协议是无状态的,但是Asp.Net Web-Forms创建了一个完整的生命周期,立即强制某种形式的状态持久化你的申请。

帮助减轻其中一些压力的工具之一是臭名昭著的邪恶更新面板。这个面板没什么特别的,它只是将整个页面复制到内存,然后通过 Ajax 执行 Postback 以在没有 flicker[ 的情况下访问服务器=63=] 当您通常执行 Postback 时会发生这种情况。

更新面板问题:

  • 性能重。
  • 难以调试或确保正常工作。
  • 难以判断页面状态。

第三点是最普遍的一个原因,它让你在一个圈子里写代码。我想说的是,您的页面已加载。 更新面板触发,页面刷新。页面通过客户端修改,更新面板触发器,页面刷新无需客户端修改。

The server isn't aware of your Client-Side change, it doesn't persist in memory. So when the Update Panel triggers it recalls the page from the last moment the server sent data.

真正解决这个问题的唯一方法。您必须实施 QueryStrings 和其他细微差别,以帮助确保 Server-SideClient-Side 保持同步。这会非常快地做出意大利面,所以希望你喜欢意大利面。

避免这些情况的最佳方法是利用 Web 服务 并发送您自己的 Ajax 以确保页面始终反映目标,因此当您的用户执行 Postback 时,您可以控制发送的数据。

希望这个解释能详细解释使用更新面板的陷阱。除非您可以避免 JavaScript 并完全依赖服务器,否则以我上面提到的方式重做页面可能会快得多。

我想真正说明为什么您应该使用自己的 Ajax 并自己完成,而无需通过 更新面板 自动应用数据。您不应该使用面板,应该自己动手。