我的 Asp.Net 页面回传似乎在页面重置之前有固定数量的回传

My Asp.Net page postbacks seems to have a fixed number of postbacks before the page resets

提问人:Eric Plante 提问时间:11/17/2023 更新时间:11/17/2023 访问量:35

问:

---我的问题的背景:---

我正在 VS 2022 中进行测试,并使用 IIS Express (Chrome) 启动网站。在 UpdatePanel 的 AutoPostBack=true 组合框中选择 10+ 个项目后,页面在成功处理其中 9 个项目后重置。通过重置,我的意思是在Page_PreLoad,当它工作时一切正常,ViewState 是空的,并且控件不再为完全相同的页面和完全相同的逻辑实例化。

该问题是在正常执行期间发现的,但它需要更多的体操才能重现,因此我将测试重新调整到该组合框,并在回调方法中添加了 3 秒的线程睡眠以进行模拟。无论回调休眠多长时间,它总是在 9 点后停止工作。

--- 问题:---

使用 ajax 或 IIS Express 或 IIS 或其他任何可以执行我描述的操作的链回发数量是否有某种限制?

在网上搜索,我发现所有的东西都不适用;ViewState 大小不会增长,并且非常小,为 128 字节,池中的可用线程数和最大线程数不会缩小超过 1,请求的大小很好。

--- 布局和代码:---

我们有一个带有面板的页面,该面板创建用户控件的实例列表,其中包含各种 PageView 中的各种控件,每个实例仅显示一个 PageView,并且只有一个实例是面板中出现问题的实例。这不是构建用户控件的最佳方式,但我按原样继承了该站点。

不幸的是,我不能发布正式的代码,但我会尝试提供尽可能多的代码来说明控件的上下文。

****** The user Control ******

我只保留了该问题的页面视图,因为其他视图不相关。

    <%@ Control Language="C#" AutoEventWireup="true" %>
    <td class='<%# TdClass %>'>
        <telerik:RadPageView ID="PV1 runat="server">
            some controls
        </telerik:RadMultiPage>
        <telerik:RadPageView ID="PV2 runat="server">
            some controls
        </telerik:RadMultiPage>

        <telerik:RadPageView ID="PV3" runat="server">
            <div style="width: 75px; float: left;"> 
                <asp:UpdatePanel ID="UP1" runat="server" >
                    <ContentTemplate>
                        <telerik:RadSearchBox ID="Combo1" runat="server" Width="100%" DataTextField="Descr"
                            DataValueField="Id" ZIndex="7001" EmptyMessage="- nom -" ShowSelectItem="true"
                            SelectItemText="" ExpandAnimation-Type="None" CollapseAnimation-Type="None"
                            AutoPostBack="true" OnSelectedIndexChanged="Combo1_SelectedIndexChanged" >
                        </stm:STMRadSearchBox>
                    </ContentTemplate>
                </asp:UpdatePanel>
           </div>
        </telerik:RadPageView>
    </telerik:RadMultiPage>
    </td>
        protected void Combo1_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e)
        {
            Thread.Sleep(3000);
        }
****** The panel creating a List of UserControl ******
    <%@ Control Language="C#" AutoEventWireup="true" %>
    <telerik:RadAjaxPanel ID="IIRAP" runat="server">
    <div class="Content">
        <span id="tata"></span>
        <telerik:RadListView ID="LVI" runat="server" GroupItemCount="3" OnNeedDataSource="LVI_NeedDataSource"
            OnItemCreated="LVI_ItemCreated" OnPreRender="LVI_PreRender" Visible="<%# CanViewIntervenant %>">
            <LayoutTemplate>
                <table>
                    <tr id="groupPlaceholder" runat="server">
                    </tr>
                </table>
            </LayoutTemplate>
            <GroupTemplate>
                <tr>
                    <uc:ICTL ID="itemPlaceholder" runat="server" />
                </tr>
            </GroupTemplate>
            <ItemTemplate>
                <uc:ICTL ID="ICTL1" runat="server" />
            </ItemTemplate>
            <EmptyItemTemplate>
                <th>
                    &nbsp;</td>
                    <td>
                        &nbsp;
                    </td>
            </EmptyItemTemplate>
        </telerik:RadListView>
    </div>
    </telerik:RadAjaxPanel>
****** The page using the panel ******
    <%@ Page Language="C#"  %>
    <%@ Register Src="~/UserControl/Detail.ascx" TagPrefix="uc" TagName="Detail" %>
    <asp:Content ID="Content2" ContentPlaceHolderID="MC" runat="server" style="height: 100%">
    <div id="divPageContent">
        <asp:ValidationSummary ID="ValidationSummarySave" runat="server" ValidationGroup="Save" CssClass="errorSummary" Style="margin-top: 30px;" />
        <telerik:RadPanelBar ID="PD1" runat="server" Width="100%" ExpandMode="MultipleExpandedItems">
            <Items>
                <telerik:RadPanelItem Value='<%# RadPanelItemValue.Intervenants.ToString() %>' Text="Intervenants"
                    Expanded="true">
                    <Items>
                        <telerik:RadPanelItem>
                            <ItemTemplate>
                                <uc:DetailID="II1" runat="server" />
                            </ItemTemplate>
                        </telerik:RadPanelItem>
                    </Items>
                </telerik:RadPanelItem>
            </Items>
        </telerik:RadPanelBar>
    </div>
   </asp:Content>
asp.net Ajax IIS Telerik

评论

0赞 Albert D. Kallal 11/17/2023
您这里有相当多的 Telerick 控件。你能在没有这些第三方控件的情况下发布一个可重现的例子吗?请记住,更新面板每次都会触发页面加载,因此它不像更新面板那样阻止页面回发(它仍然会触发页面生命周期,并且每次都会触发页面加载)。更糟糕的是,如果更新面板回发代码尚未完成,并且您再次单击,则现有代码将终止并重新运行。您可能希望将控件 visible = false 设置为“请稍候”,因为您确实必须让代码隐藏在另一个回发之前完成。
0赞 Eric Plante 11/18/2023
我希望我能发布一个可用的样本,但这确实是我能做的最好的事情,而且我知道生命周期。我试图找到使控件等待帖子返回完成的方法,然后再使客户端再次做出反应,但我没有找到一种方法。我在客户端的 javascript 中添加了 2 秒的延迟 SelectedIndexChanging 并且当回发在事件发生后和下一个事件发生之前时,也发生了完全相同的错误。
0赞 Albert D. Kallal 11/18/2023
只需在按钮上添加一个客户端 js 存根,例如 OnClientClick=“$(this).hide()”,按钮将自动隐藏,直到回发完成
0赞 YurongDai 11/24/2023
检查浏览器控制台中是否存在异步回发期间可能发生的任何 JavaScript 错误。这些错误可能会中断页面的正常流程。

答:

0赞 Eric Plante 11/27/2023 #1

感谢大家的投入。让我的想法朝着正确的方向发展的是,在发送另一个回发之前,必须完成回发。我之前探索过这个想法,但没有找到解决方案,这很奇怪,因为我一定不是第一个遇到此类问题的人。我敢肯定它就在那里,只是由于某些原因从未偶然发现它。一个有效的解决方案来自一个意想不到的来源,即所有地方的 chatGPT。以防万一它可能会帮助其他人,尽管我怀疑有更好的解决方案,因为这似乎是处理这个问题的一种尴尬方法,但这里是:

        <script type="text/javascript">
            var _requestsAdded = false;
            function pageLoad() {
                if (_requestsAdded == false) {
                    var prm = Sys.WebForms.PageRequestManager.getInstance();
                    prm.add_beginRequest(BeginRequestHandler);
                    prm.add_endRequest(EndRequestHandler);
                    _requestsAdded = true;
                }
            }
            function BeginRequestHandler(sender, args) {
                //Start of PostBack.
                var element= document.getElementById('<%= serverSideControl.ClientID %>');
                element.control._enabled = false
            }

            function EndRequestHandler(sender, args) {
                //end of postback
            }
        </script>