Почему мой ViewState не сохраняется?

1

Достаточно простой вопрос, хотя, возможно, лучшим заголовком будет "Я понятия не имею, что я делаю, когда дело доходит до ViewStates, пожалуйста, помогите мне". То, что я хочу сделать, это нажать btnAddSkills и создать новую строку внизу существующей таблицы (и если она не существует, btnAddSkills таблицу). В настоящее время первая строка добавляется при щелчке по btnAddSkills, но когда она щелкнула второй раз, она btnAddSkills первую строку (и выбранное значение DropBox внутри одной из ячеек теряется.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication3
{
    public partial class _Default : System.Web.UI.Page
    {
        private Table tblSkillsMaster;

        protected void Page_Load(object sender, EventArgs e)
        {
            //my past experience tells me something will need to go in here
        }

        protected void btnAddSkill_Click(object sender, EventArgs e)
        {
            if (ViewState["masterSkills"] != null)
            {
                tblSkillsMaster = (Table)ViewState["masterSkills"];
            }
            else
            {
                plhSkillsTable.Controls.Clear(); //plh is a PlaceHolder
                tblSkillsMaster = new Table();
                plhSkillsTable.Controls.Add(tblSkillsMaster);
            }
            tblSkillsMaster.Rows.Add(AddRow()); //handled elsewhere, cut for brevity
            ViewState["masterSkills"] = (Table)tblSkillsMaster;
        }
    }
}
  • 0
    Откуда вы знаете, что ViewState не сохранился? У вас есть EnableViewState=false на вашей странице?
  • 0
    Вы пытались отладить и посмотреть, что находится в ViewState ["masterSkills"]? Это ноль?
Показать ещё 1 комментарий
Теги:
viewstate

4 ответа

1
Лучший ответ

Вы можете попробовать такие тесты:

protected void btnAddSkill_Click(object sender, EventArgs e)
{
    if (ViewState["masterSkills"] != null)
    {
        tblSkillsMaster = (Table) ViewState["masterSkills"];
    }
    else
    {
        plhSkillsTable.Controls.Clear(); //plh is a Placeholder
        tblSkillsMaster = new Table();
        plhSkillsTable.Controls.Add(tblSkillsMaster);
    }
    var row = new TableRow();
    for (int cellNum = 0; cellNum < 3; cellNum++)
    {
        var cell = new TableCell {Text = cellNum.ToString()};
        row.Cells.Add(cell);
    }
    tblSkillsMaster.Rows.Add(row);

    // *** System.Web.UI.WebControls.Table is not serializable ***
    // ViewState["masterSkills"] = tblSkillsMaster;
}

System.Web.UI.WebControls.Table не является сериализуемым

Однако вы не можете добавить System.Web.UI.WebControls.Table в ViewState, поскольку он не является сериализуемым.

Возможно, вы захотите использовать Class вместо Table.

2

Из MSDN: типы данных, которые можно сохранить в состоянии просмотра. Вы можете хранить объекты следующих типов в состоянии просмотра:

  • Струны
  • Целые
  • Булевы значения
  • Объекты массива
  • Объекты ArrayList
  • Хэш-таблицы
  • Преобразователи пользовательского типа

В противном случае вы можете создать свой собственный класс и сделать его сериализуемым с помощью атрибута Serializable.

В вашем случае вы не можете редактировать класс Table, чтобы добавить атрибут, так как вы его не владеете. Что вы можете сделать, так это создать свой собственный класс, который будет использовать информацию из таблицы, которую вы хотите, и обрабатывать назад и вперед между вашим классом, который можно использовать в viewstate с классом Table.

1

ViewState может содержать только сериализуемые объекты, в этом случае System.Web.UI.WebControl.Table не является serilizable и, следовательно, вы не можете сохранить его в viewstate. Вместо этого вы можете использовать DataTable и GridView для достижения своей цели.

1

Единственное, что я вижу в опубликованном вами коде, это то, что вам не нужно бросать таблицу, чтобы поместить ее в ViewState.

Попробуйте изменить это:
ViewState["masterSkills"] = (Table)tblSkillsMaster;
К этому:
ViewState["masterSkills"] = tblSkillsMaster;

Вам нужно отбрасывать при извлечении из ViewState.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню