У меня есть следующее свойство в настраиваемом элементе управления:
List<myClass> _items;
public List<myClass> Items{
get { return _items; }
set { _items= value; }
}
В моем выделенном коде я добавляю элементы в коллекцию, как в ...
myCustomControl.items.Add(new myClass());
Однако они не сохраняются при обратной передаче. Как правильно разрешить постоянство пользовательских элементов управления?





если вы говорите о сохранении данных в обратных передачах одной и той же страницы, вы можете вручную добавить элементы в ViewState и получить их при загрузке.
Вы можете сохранить их в контроле viewstate
public List<myClass> Items{
get { return this.ViewState["itemsKey"] }
set { this.ViewState["itemsKey"]= value; }
}
Опять же, MyClass должен быть сериализуемым, чтобы хранить его во ViewState.
Вы должны привести возвращаемое значение в get {}. ViewState имеет тип Object, а не List <myClass>.
Ой! Не помещайте List <> в ViewState! Это будет грандиозно!
Если вы добавите List <string>, который содержит два элемента - «abc» и «xyz», в ViewState, он увеличится на 312 байт.
Если вместо этого вы добавите строку [], содержащую те же два элемента, она увеличится только на 24 байта.
И это всего лишь списки строк! Вы можете разместить там свои классы, как предлагает Кори Дауни, но ваше ViewState будет расти как грибы!
Чтобы сохранить разумный размер, вам придется приложить определенные усилия, чтобы преобразовать список элементов в массивы строк и обратно.
В качестве альтернативы рассмотрите возможность помещения ваших объектов в сеанс: таким образом ваши объекты будут храниться на сервере, а не сериализоваться в ViewState и отправлены в браузер и обратно.
Хранить элементы в сеансе, вероятно, хуже, чем хранить их в ViewState. Теперь у вас есть дополнительная проблема: требуются закрепленные сеансы в веб-ферме.
Согласовано. Сессии оооочень ограничены (хотя это довольно удобно, когда вы их используете может).
Я согласен с тем, что есть проблемы со списком <> в viewstate, но он работает. Обратите внимание, что здесь нет сеттера по дизайну. Вам нужна ссылка на объект объекта списка, и ваш метод get может обновлять список при необходимости.
protected List<myClass> Items
{
get
{
if (ViewState["myClass"] == null)
ViewState["myClass"] = new List<myClass>();
return (List<myClass>)ViewState["myClass"];
}
}
Один из способов преодолеть проблему размера общего списка - сохранить его во ViewState в качестве основного типа массива:
protected List<string> Items
{
get
{
if (ViewState["Items"] == null)
ViewState["Items"] = new string[0];
return new List<string>((string[])ViewState["Items"]);
}
set
{
ViewState["Items"] = value.ToArray();
}
}
Крис, это сработает при назначении списка свойству (list.Add ("abc"); Items = list;), но не удастся сохранить список, измененный с помощью следующего: Items.Add ("abc") ; Это не очень интуитивно.
Пока List <> и myClass отмечены как Serializable, все будет работать нормально. В противном случае ему придется переопределить SaveViewState и LoadViewState.