Get и Set не работают со списком <> - PullRequest
0 голосов
/ 07 декабря 2011

Я пытаюсь получить и установить, чтобы мой список <> был постоянным. Я думаю, что мое намерение ясно с кодом. Я хочу, чтобы список оставался во всех постбэках, поэтому я не теряю в нем данные.

Что я делаю не так? Благодаря моему AlertPopUp я вижу, что Get запускается, но никогда не Set. Таким образом, список возвращается как содержащий нулевые элементы, когда в нем должно быть несколько элементов.

 private List<string> accountIDsSelectedForDeletion = new List<string>();
public List<string> AccountIDsSelectedForDeletion
{
    get {
        if (ViewState["AccountIDsSelectedForDeletion"]!= null)
        {
            accountIDsSelectedForDeletion = ViewState["AccountIDsSelectedForDeletion"] as List<string>;
            AlertPopUp.QuickDebugMessage("getting list from viewstate. Count: "+ accountIDsSelectedForDeletion.Count);            
        }
        AlertPopUp.QuickDebugMessage("returning list");   
        return accountIDsSelectedForDeletion;

    }
    set {
        AlertPopUp.QuickDebugMessage("setting list to viewstate. Count: " + accountIDsSelectedForDeletion.Count); 
        accountIDsSelectedForDeletion = value;

        ViewState["AccountIDsSelectedForDeletion"] = accountIDsSelectedForDeletion;
    }

1 Ответ

0 голосов
/ 07 декабря 2011

Может ли это быть потому, что я изменил список с помощью метода Add ()?

В двух словах, да. .Add() изменяет список, а свойство Set действует в списке как часть набора.

Чтобы выполнить то, что вы пытаетесь сделать здесь, я бы создал унаследованный тип из List, чтобы я мог внедрить код в методы Add Remove (ext, есть другие). Как:

//not syntatically correct sorry
public class MyList : List<string>
{
    public override Add(string NewItem)
    {
        //do a extra peristance step here
        //
        me.Add(NewItem);
    }
}

Или есть класс, который упаковывает приватный List <> и управляет методами Add / Remove, например:

public class MyList
{
    private List<string> listItems { get; set; }
    //don't expose the list in a mutable state, IEnumerable instead
    public IEnumerable<string> Items { get { return this.listItems; } }

    public void Add(string NewItem)
    {
        this.ListItems.Add(NewItem);
    }
}

Затем просто замените List на этот тип в классе уровня своей страницы.

Между прочим, сохранение значения ViewState увеличивает объем информации, которую вы должны посылать по сети по каждой загрузке страницы. Вы рассматривали Session, или Cache объект?

...