У меня есть страница ASP.NET, которая содержит пользовательский элемент управления с именем ReportCtrl (мой собственный элемент управления, который не имеет ничего общего со службами отчетов и т. Д.). ReportCtrl имеет пользовательский элемент управления под названием TreeViewCtrl, который содержит Telerik TreeView с несколько прикольной бизнес-логикой для отображения узлов.
TreeView находится внутри панели ASP.NET AJAX. Когда пользователь нажимает на проверяемый узел, он отправляет сообщение обратно на сервер и сохраняет новый объект Mapping (помеченный как Serializable) в List, который хранится в ViewState.
Проблема, с которой я столкнулся, заключается в следующем: -
- Когда установлен первый флажок, элемент сохраняется в списке, который затем добавляется в ViewState.
- Когда установлен второй флажок, элемент сохраняется в списке, который затем добавляется в ViewState.
- Когда установлен третий флажок, загруженный ViewState содержит только 1 элемент.
Я переопределил проверку количества элементов в ViewState, и я вижу, что при проверке второго элемента SaveViewState сохраняет ViewState с 3 элементами. Когда в третьем флажке вызывается LoadViewState, я вижу, что декодированный ViewState содержит только 1 элемент.
protected override void LoadViewState(object savedState)
protected override object SaveViewState()
Почему-то Viewstate работает только для 1 элемента и только для первого элемента.
Мы убедились, что это не имеет никакого отношения к Telerik TreeView, удалив его и просто добавив элементы вручную при событиях нажатия кнопки. Мы также удалили объект, сохранив список строк.
У нас свежие идеи о том, что попробовать. Кто-нибудь сталкивался с этим вопросом раньше? Есть идеи, которые мы можем попробовать?
Спасибо.
КОД
Вот код для панели обновления:
<asp:UpdatePanel runat="server" ID="upnlTreeView" ChildrenAsTriggers="true"
RenderMode="Inline" UpdateMode="Conditional" EnableViewState="true">
<ContentTemplate>
<telerik:RadAjaxManager runat="server" ID="RadAjaxManager1">
<AjaxSettings>
<telerik:AjaxSetting AjaxControlID="RadAjaxManager1">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="ClickedNodeLabel" />
</UpdatedControls>
</telerik:AjaxSetting>
</AjaxSettings>
</telerik:RadAjaxManager>
<telerik:RadTreeView ID="RadTreeView1" runat="server" Width="100%" Height="420px"
PersistLoadOnDemandNodes="true" LoadingStatusPosition="BelowNodeText" CausesValidation="false"
OnClientNodePopulated="nodePopulated" OnClientNodePopulating="nodePopulating" OnClientLoad="onLoad"
CheckBoxes="true" CheckChildNodes="false" AllowNodeEditing="false" MultipleSelect="false"
LoadingMessage="Loading..." AppendDataBoundItems="true" Skin="Vista" EnableViewState="true"
onnodecheck="RadTreeView1_NodeCheck" >
<ExpandAnimation Type="none" />
<CollapseAnimation Type="none" />
<WebServiceSettings Path="/ESConsole/ws/PTService.asmx" Method="GetNodes" />
</telerik:RadTreeView>
</ContentTemplate>
Вот код для определения List и других методов в коде:
public List<ECodeMapping> ECodeMappings
{
get
{
return (ViewState["__lstECodeMapping"] == null) ? new List<ECodeMapping>()
: ViewState["__lstECodeMapping"] as List<ECodeMapping>;
}
set { ViewState["__lstECodeMapping"] = value; }
}
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
int count1 = (ViewState["__lstECodeMapping"] as List<ECodeMapping>).Count;
}
protected override object SaveViewState()
{
int count1 = (ViewState["__lstECodeMapping"] as List<ECodeMapping>).Count;
return base.SaveViewState();
}
protected void RadTreeView1_NodeCheck(object sender, RadTreeNodeEventArgs e)
{
RadTreeNode node = e.Node;
int iLevel = node.Attributes["Level"].ToSafeInt();
if (iLevel == 2)
{
var nList = ECodeMappings.FindAll(x => x.DocId == node.Value.ToSafeInt() && x.SecId < 1);
if (nList.Count() == 0 && node.Checked == true)
{
// Add the node if it doesn't exist
ECodeMapping newMapping = new ECodeMapping { ReportId = ReportId, DocId = node.Value.ToSafeInt(), SecId = int.MinValue };
ECodeMappings.Insert(0, newMapping);
return;
}