--- 我的问题的背景:---
我正在 VS 2022 中进行测试,并使用 IIS Express (Chrome) 启动网站。在 UpdatePanel 内的 AutoPostBack=true 组合框中连续选择 10 多个项目后,页面会在成功处理其中 9 个后重置。我所说的重置是指在 Page_PreLoad 时,一切正常,但 ViewState 为空,并且对于完全相同的页面和完全相同的逻辑,不再实例化控件。
问题是在正常执行期间发现的,但它需要更多的体操才能重现,因此我将测试限制在该组合框上,并在回调方法中添加了 3 秒的线程睡眠来模拟。无论回调休眠多长时间,它总是在 9 点后停止工作。
--- 问题: ---
使用 ajax 或 IIS Express 或 IIS 或任何其他可以执行我描述的操作的链接回发数量是否有某种限制?
网上搜了一下,发现都不适用;视图状态大小不会增长,非常小,为 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>
</td>
<td>
</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>
感谢大家的投入。使我的想法朝着正确方向发展的事实是,回发必须在发送另一个回发之前完成。我之前探索过这个想法,但没有找到解决方案,这很奇怪,因为我一定不是第一个遇到此类问题的人。我确信它就在那里,只是由于某些原因从未偶然发现它。一个有效的解决方案来自一个意想不到的来源,即所有地方的 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>