объект класса, сериализуемый для хранилища ViewState, не работает в c # ASP.net

#c# #asp.net #object #viewstate #serializable

#c# #asp.net #объект #состояние просмотра #сериализуемый

Вопрос:

Я создал панель для хранения своих списков, моя цель — динамически добавлять новые списки, когда я нажимаю кнопку управления на странице.

Я создал класс myList, который наследует класс List, и я применил тег [Serializable] . Я применил сериализацию для хранения объекта в viewstate.

Класс myList будет хранить все динамически созданные списки.

вопросы:

  • Когда код выполняется, страница загружается, но когда я нажимаю кнопку, чтобы сохранить состояние просмотра списка, я получаю сообщение об ошибке, как так получилось?
  • Насколько я знаю, мне просто нужно было сериализовать класс myList, чтобы сохранить его в viewstate, это правильно?
  • Нужно ли мне также сериализовать базовый класс (список) myList?
     public partial class _default : System.Web.UI.Page
    {
        MyList<ListBox> myList;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            myList = new MyList<ListBox>();
            myList.Add(new ListBox());
            Panel1.Controls.Add(myList[0]);
            Button1.Click  = Add_ListBox1;
        }
    
        public void Add_ListBox1(object sender, EventArgs e)
        {
            ListBox temp_listBox = new ListBox();
            myList.Add(temp_listBox);
            Panel1.Controls.Add(temp_listBox);
            ViewState["ListBox_list"] = myList; 
        }
    }
    
    [Serializable]
    public class MyList<ListBox> : List<ListBox> 
    { 
    
    }
     

страница отображается перед щелчком мыши:

введите описание изображения здесь

сообщение об ошибке после нажатия кнопки:
введите описание изображения здесь

Комментарии:

1. System.Web.UI.WebControls. ListBox не является сериализуемым компонентом. Я думаю, что любой список, который вы добавляете на веб-страницу, будет автоматически использовать viewstate. С какой целью вы хотите сохранить mylist?

2. Списки будут использоваться для создания выбора категории продукта. В зависимости от выбора, сделанного в одном списке, подкатегории будут отображаться в следующем списке. Он должен быть динамичным, поскольку количество списков может варьироваться в зависимости от выбранных подкатегорий или категорий. Списки необходимо передавать на сервер для чтения и записи данных из базы данных.

3. Я согласен с Брайаном в этом. Возможно, вы могли бы использовать древовидное представление вместо использования динамических списков.

Ответ №1:

Хотя вы пометили свой класс [serializable] , это зависит от ListBox, который не является сериализуемым.

Я немного погуглил и нашел это, что может помочь, хотя это выглядит более сложным, чем я ожидал.

Пара быстрых мыслей:

  • Динамический контент — одно из слабых мест в WebForms, потому что, как вы видите, динамический контент теряется после обратной передачи, поэтому его необходимо сохранить и каким-то образом воссоздать. В таких ситуациях я стараюсь исключить обратную передачу и больше полагаться на JavaScript, чтобы браузер никогда не перезагружался… И это одно из мест, где новая модель MVC блистает, потому что она не борется с вами постоянно (как непреднамеренно делает модель postpack). На самом деле, эта проблема — одна из главных причин, подталкивающих нас к одностраничным приложениям.
  • Возможно, вам было бы лучше написать свой собственный класс, который содержит то, что вас волнует в отношении этих списков, таких как position и их содержимое, которое, надеюсь, представляет собой всего лишь несколько простых строк, и вместо этого сериализуйте это… Затем напишите свой собственный код для десериализации их в списки.

Ничего не имею против веб-форм, кстати, у меня есть одна открытая прямо сейчас в другом окне!

Комментарии:

1. не по теме, но все же: многие аспекты сайта, который я создаю, основаны на динамическом содержимом, таком как этот запрос listbox . Веб-сайт, который я пытаюсь создать, — это электронная коммерция с нуля. Я уже построил всю свою логику базы данных. Чтение того, что вы говорите об использовании webforms динамически, обескураживает меня в продолжении, я потратил так много времени на обучение ASP.net webforms, но что, если я перезапущу все с помощью MVC, будет ли это драматический путь обучения? Является ли MVC тенденцией?

2. @Luther Когда я говорю о динамическом контенте, я имею в виду, в частности, добавление новых элементов управления «на лету». Это то, что ты задумал?

3. Да, добавление форм, элементов управления … программно

4. @Luther Ну, я бы не сказал, что это просто неправильное направление, webforms вполне способен справиться с этим… Это не очень просто, независимо от того, какую платформу вы используете. Дело в том, что вы теряете часть возможностей обратной передачи, потому что, если вы используете обратную передачу, вам потребуется все перестроить. Таким образом, вы в конечном итоге пишете весь этот код для восстановления состояния. Но, возможно, это еще не конец света.

5. @JohnSaunders Спасибо, что сообщили мне, почему вы проголосовали против меня, Джон. Тем не менее, я убедительно прошу вас прочитать это еще раз, поскольку я не думаю, что сказал то, что вы думаете. 🙂 Я заявил, что модель обратной передачи веб-форм борется с вами в конкретной ситуации работы с динамически создаваемым контентом, потому что ее использование приводит к потере содержимого. Если есть какой-то способ, который не соответствует действительности, я искренне хотел бы знать, как туда добраться, поскольку это было больной точкой в нескольких проектах.