Shailesh vora Ответов: 3

LoadViewStateRecursive не удалось загрузить viewstate


Привет,
Я создал динамические элементы управления в asp.net веб-приложение.для этого я последовал следующим шагам
1) я создал свой выпадающий список пользовательского элемента управления(.ascx), в котором я упомянул следующие свойства, чтобы усилить его существующую функциональность.

MyDropDown.ascx вносятся

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyTestDropDown.ascx.cs" Inherits="MyTest.MyTestDropDown" %>
<asp:DropDownList ID="ddlList" runat="server">
</asp:DropDownList>


с фоновым кодом:-
public Object DataSource { get { return ddlList.DataSource; } set { ddlList.DataSource = value; } }
        public string DataTextField { get { return ddlList.DataTextField; } set { ddlList.DataTextField = value; } }
        public string DataValueField { get { return ddlList.DataValueField; } set { ddlList.DataValueField = value; } }
        public bool AutoPostBack { get { return ddlList.AutoPostBack; } set { ddlList.AutoPostBack = value; } }
        public string SelectedValue { get { return ddlList.SelectedValue; } set { ddlList.SelectedValue = value; } }
        public string SelectedText { get { return ddlList.SelectedItem.Text; } set { ddlList.SelectedItem.Text = value; } }
        public int SelectedIndex { get { return ddlList.SelectedIndex; } set { ddlList.SelectedIndex = value; } }
        public Unit Width { get { return ddlList.Width; } set { ddlList.Width = value; } }
        public ListItemCollection Items { get { return ddlList.Items; } }

        /*  TRIED WITH FOLLOWING OPTION BUT CAN'T LUCK :)
         public string QueryResultSeparater { get { return ViewState["QueryResultSeparater"].ToString(); } set { ViewState["QueryResultSeparater"] = value; } }
        public string Query { get { return ViewState["Query"].ToString(); } set { ViewState["Query"] = value; } }
        public string Name { get { return ViewState["Name"].ToString(); } set { ViewState["Name"] = value; } }
        public string DisplayText { get { return ViewState["DisplayText"].ToString(); } set { ViewState["DisplayText"] = value; } } */

        public string QueryResultSeparater { get; set; }
        public string Query { get; set; }
        public string Name { get; set; }
        public string DisplayText { get; set; }

        public event EventHandler DropDownSelectedIndexChanged;
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            this.ddlList.SelectedIndexChanged += new EventHandler(ddlList_SelectedIndexChanged);
        }
        public void ClearSelection()
        {
            ddlList.ClearSelection();
        }
        private void ddlList_SelectedIndexChanged(object sender, EventArgs e)
        {
            SelectedIndexChanged(e);
        }
        protected void SelectedIndexChanged(EventArgs e)
        {
            if (DropDownSelectedIndexChanged != null)
            {
                DropDownSelectedIndexChanged(this, e);
            }
        }


2)я назвал этот элемент управления. ascx на странице text. aspx следующим образом
protected void Page_Load(object sender, EventArgs e)
      {

 TableCell newCell = new TableCell();                      
            MyDropDown customDropdown = LoadControl(.ASCX PATH ...) as MyDropDown;
            MyDropDown ddl = customDropdown;
            ddl.ID = //name ofcontrol .....;
            ddl.DisplayText = //headertext.....
            ddl.AutoPostBack = true;
            ddl.Query = ;//Data query
            ddl.Width = Unit.Pixel(100);
            ddl.Name = //name of control;          
            ddl.DropDownSelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
            newCell.Controls.Add(ddl);
            row.Controls.Add(newCell);
            DataTable.Rows.Add(row); // Table object and row object is already in my page so not mentioning that logic here..
}


3) Когда я публикую свое приложение , некоторое время я получаю следующую ошибку в файле errorlog, где я сохраняю ошибку.

ОШИБКА:=> LoadViewStateRecursive не удалось загрузить viewstate. Дерево элементов управления, в которое загружается viewstate, должно соответствовать дереву элементов управления, которое использовалось для сохранения viewstate во время предыдущего запроса. Например, при динамическом добавлении элементов управления элементы управления, добавленные во время обратной передачи, должны соответствовать типу и положению элементов управления, добавленных во время первоначального запроса.

Пожалуйста, помогите мне, если кто-нибудь знает лучшее решение этой проблемы.
заранее спасибо.

3 Ответов

Рейтинг:
25

Michiel du Toit

Привет,

Вы должны (повторно)создать свои динамические элементы управления в событии Page_Init , которое происходит до загрузки состояния представления.

Вы можете создать элементы управления в первый раз в Page_Load или в большинстве событий - просто убедитесь, что воссоздали их в Page_Init, когда страница будет загружена снова.

Если вам нужно отслеживать, какие элементы управления нужно воссоздать, вы должны использовать хранилище без viewstate во время Page_Init (т. е. переменные сеанса), так как viewstate *не* был загружен.

Хорошая статья, объясняющая ASP.NET жизненный цикл страницы что делать:
ASP.NET жизненный цикл приложения и страницы[^]


Member 12855870

хай
Как решить эту проблему

Рейтинг:
2

Shailesh vora

Спасибо за публикацию ответа.
да, я сделал это, но все же когда-то проблема приближалась, поэтому вместо элемента управления .ascx я создал свой пользовательский элемент управления, так что теперь ожидание позволяет увидеть :) проблема все еще сохраняется или нет.


Рейтинг:
2

Member 11711524

У меня была та же проблема. Эта проблема была на стороне клиента, но она не возникла в моей локальной системе.
После нескольких часов поиска в Google я написал EnableViewState= "false" в свой тег таблицы на странице aspx, который имеет все динамические элементы управления, а затем удалил все переменные viewstate и вместо этого создал несколько скрытых текстовых полей на странице aspx и принял в них значения DB в коде позади и использовал их во всем своем коде. Тогда это решило мою проблему.
Но все равно я не мог понять, в чем именно проблема.