ViewState не сохраняется при обратной передаче во второй раз при обратной передаче страницы - PullRequest
0 голосов
/ 17 декабря 2009

У меня есть страница ASP.NET, которая содержит пользовательский элемент управления с именем ReportCtrl (мой собственный элемент управления, который не имеет ничего общего со службами отчетов и т. Д.). ReportCtrl имеет пользовательский элемент управления под названием TreeViewCtrl, который содержит Telerik TreeView с несколько прикольной бизнес-логикой для отображения узлов.

TreeView находится внутри панели ASP.NET AJAX. Когда пользователь нажимает на проверяемый узел, он отправляет сообщение обратно на сервер и сохраняет новый объект Mapping (помеченный как Serializable) в List, который хранится в ViewState.

Проблема, с которой я столкнулся, заключается в следующем: -

  1. Когда установлен первый флажок, элемент сохраняется в списке, который затем добавляется в ViewState.
  2. Когда установлен второй флажок, элемент сохраняется в списке, который затем добавляется в ViewState.
  3. Когда установлен третий флажок, загруженный 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;
            }

Ответы [ 2 ]

0 голосов
/ 18 декабря 2009

Нашел проблему.

У нас в родительском пользовательском элементе управления был скрипт, который выглядел следующим образом: -

ПЛОХОЙ КОД

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(EndRequest);
var postBackElement;
function EndRequest(sender, args) {
    if (postBackElement.id == '<%= btnUpload.ClientID %>')
        var uprog1 = $get('<%= this.UpdateProgress1.ClientID %>');
        if(uprog1 != null)
        {
         uprog1.style.display = 'none';
        }
        $find('<%= mpeProgress.ClientID %>').hide();
}

Этот обидный скрипт должен был быть изменен на: -

ХОРОШИЙ КОД

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(EndRequest);
var postBackElement = null;
function EndRequest(sender, args) {
    if (postBackElement != null && postBackElement.id == '<%= btnUpload.ClientID %>')
        var uprog1 = $get('<%= this.UpdateProgress1.ClientID %>');
        if(uprog1 != null)
        {
         uprog1.style.display = 'none';
        }
        $find('<%= mpeProgress.ClientID %>').hide();
}

Резюме

Элемент postBackElement необходимо проверить на наличие нулей.

0 голосов
/ 18 декабря 2009

Действительно ли UpdatePanel отправляет ViewState на сервер и заменяет текущий ViewState при обновлении? Используйте Fiddler или аналогичный инструмент, чтобы посмотреть фактический HTTP-трафик. Я предполагаю, что вы не получаете ViewState для всех ваших обновлений.

...