更新面板内部回发问题
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-Side 和 Client-Side 保持同步。这会非常快地做出意大利面,所以希望你喜欢意大利面。
避免这些情况的最佳方法是利用 Web 服务 并发送您自己的 Ajax 以确保页面始终反映目标,因此当您的用户执行 Postback 时,您可以控制发送的数据。
希望这个解释能详细解释使用更新面板的陷阱。除非您可以避免 JavaScript 并完全依赖服务器,否则以我上面提到的方式重做页面可能会快得多。
我想真正说明为什么您应该使用自己的 Ajax 并自己完成,而无需通过 更新面板 自动应用数据。您不应该使用面板,应该自己动手。
我在最初隐藏的更新面板中有一个面板。 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-Side 和 Client-Side 保持同步。这会非常快地做出意大利面,所以希望你喜欢意大利面。
避免这些情况的最佳方法是利用 Web 服务 并发送您自己的 Ajax 以确保页面始终反映目标,因此当您的用户执行 Postback 时,您可以控制发送的数据。
希望这个解释能详细解释使用更新面板的陷阱。除非您可以避免 JavaScript 并完全依赖服务器,否则以我上面提到的方式重做页面可能会快得多。
我想真正说明为什么您应该使用自己的 Ajax 并自己完成,而无需通过 更新面板 自动应用数据。您不应该使用面板,应该自己动手。