Я получаю исключение при использовании ViewState - PullRequest
5 голосов
/ 15 июня 2011

Я получаю это:

System.Runtime.Serialization.SerializationException

Тип 'System.Web.UI.WebControls.Button' в сборке 'System.Web, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a' не помечена как сериализуемая. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Runtime.Serialization.SerializationException: Тип 'System.Web.UI.WebControls.Button' в сборке 'System.Web, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a' не помечена как сериализуемый.

Я получаю его, когда пытаюсь сохранить список в viewState и восстановить его в событии Page_PreInit

Я установил кнопки и добавил их в список, который позже сохранил в viewState:

      ViewState["Buttons"] = buttons;

Затем я хочу получить их и прикрепить обратно к их обработчикам событий:

  void Page_PreInit(object sender, EventArgs e)
    {

        List<Button> btn = (List<Button>)ViewState["Buttons"];
        if (btn!=null)
        {
            foreach (var item in btn)
            {
                item.Width = 20;
                item.Command += obtainTopicsPerPage_Click;
                item.CommandName = tPage.ToString();
                item.Text = tPage.ToString();
            }
        }
    }

1 Ответ

5 голосов
/ 15 июня 2011

Согласно сообщению об исключении, System.Web.UI.WebControls.Button не сериализуемо. (Это не удивительно.) Чтобы сохранить что-то во ViewState, оно должно быть сериализуемым, чтобы его полное «я» могло быть записано в строку и сохранено в значении формы hidden на странице для ViewState.

Почему вы пытаетесь сохранить Button s во ViewState? ViewState полезен для хранения небольших значений и других вещей, скрытых в форме поля. Но весь интерфейс управления? Что вы пытаетесь сделать с этим?

Если вам просто нужно динамически создавать Button элементы управления на основе некоторых данных из ViewState, то вам просто нужно сохранить минимальный объем данных, чтобы сделать это возможным, и создать Button s в коде из этих данных. Примерно так:

List<string> btn = (List<string>)ViewState["ButtonStrings"];
foreach (var str in btn)
{
    var item = new Button();
    item.Width = 20;
    item.Command += obtainTopicsPerPage_Click;
    item.CommandName = tPage.ToString();
    item.Text = tPage.ToString();
    // some use of the str from the ViewState
    // or if all you need is a count, just store an int in ViewState and use a for loop
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...