Как сохранить свойство List <T>в ASP.NET Custom Control? - PullRequest
6 голосов
/ 12 декабря 2008

У меня есть следующее свойство в пользовательском элементе управления:

List<myClass> _items;
public List<myClass> Items{
    get { return _items; }
    set { _items= value; }
}

В своем коде я добавляю элементы в коллекцию, как в ...

myCustomControl.items.Add(new myClass());

Однако, они не сохраняются во всех постбэках. Как правильно разрешить сохранение в пользовательских элементах управления?

Ответы [ 5 ]

6 голосов
/ 10 февраля 2009

Хлоп! Не помещайте Список <> в ViewState! Это будет массово!

Если вы добавите список , который содержит два элемента - «abc» и «xyz» в ViewState, он увеличится на 312 байт.

Если вместо этого вы добавите строку [], содержащую те же два элемента, она увеличится только на 24 байта.

И это только списки строк! Вы можете поместить свои классы туда, как предлагает Кори Дауни, но ваш ViewState будет расти!

Чтобы сохранить разумный размер, вам придется приложить некоторые усилия, чтобы преобразовать список элементов в массивы строк и обратно.

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

2 голосов
/ 19 февраля 2009

Одним из способов решения проблемы размера с помощью общего списка является сохранение его во 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();
    }
}
1 голос
/ 16 февраля 2009

Я согласен, что есть проблемы со списком <> в viewstate, но он работает. Обратите внимание, что в этом плане нет никакого сеттера. Вам нужна ссылка на объект объекта list, и ваш метод get может при необходимости создать новый список.

protected List<myClass> Items
{
    get
    {
        if (ViewState["myClass"] == null)
            ViewState["myClass"] = new List<myClass>();

        return (List<myClass>)ViewState["myClass"];
    }
}
1 голос
/ 20 декабря 2008

Вы можете сохранить их в viewstate управления

public List<myClass> Items{
    get { return this.ViewState["itemsKey"] }
    set { this.ViewState["itemsKey"]= value; }
}
1 голос
/ 12 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...