#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 Спасибо, что сообщили мне, почему вы проголосовали против меня, Джон. Тем не менее, я убедительно прошу вас прочитать это еще раз, поскольку я не думаю, что сказал то, что вы думаете. 🙂 Я заявил, что модель обратной передачи веб-форм борется с вами в конкретной ситуации работы с динамически создаваемым контентом, потому что ее использование приводит к потере содержимого. Если есть какой-то способ, который не соответствует действительности, я искренне хотел бы знать, как туда добраться, поскольку это было больной точкой в нескольких проектах.