Wie kann die List<T>-Eigenschaft in ASP.NET Custom Control beibehalten werden?

Ich habe die folgende Eigenschaft in einem benutzerdefinierten Steuerelement:

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

In meinem CodeBehind füge ich der Auflistung Elemente wie in...

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

Diese werden jedoch nicht über Postbacks hinweg beibehalten. Wie können sie in benutzerdefinierten Steuerelementen beibehalten werden?

Antwort auf "Wie kann die List&lt;T&gt;-Eigenschaft in ASP.NET Custom Control beibehalten werden? " 5 von antworten

, wenn Sie davon sprechen, die Daten über Postbacks derselben Seite hinweg beizubehalten, dann können Sie die Elemente manuell zum ViewState hinzufügen und sie bei Laden abrufen.

Sie können sie im Steuerelement-Ansichtszustand

public List<myClass> Items{
    get { return this.ViewState["itemsKey"] }
    set { this.ViewState["itemsKey"]= value; }
}
speichern

Yikes! Legen Sie keine Liste<> in den ViewState! Es wird massiv sein!

Wenn Sie eine Liste<string> hinzufügen, die zwei Elemente enthält - "abc" und "xyz" in den ViewState, wächst sie um 312 Bytes.

Wenn Sie stattdessen eine Zeichenfolge[] hinzufügen, die die gleichen beiden Elemente enthält, wächst sie nur um 24 Bytes.

Und das sind nur Listen von Strings! Sie können Ihre Klassen dort setzen, wie Corey Downie vorschlägt, aber Ihr ViewState wird Pilz!

Um es eine vernünftige Größe zu halten, müssen Sie einige Anstrengungen unternehmen, um Ihre Liste von Elementen in Arrays von Zeichenfolgen und wieder zurück zu konvertieren.

Alternativ sollten Sie Ihre Objekte in die Sitzung einlagern: Auf diese Weise werden Ihre Objekte auf dem Server gespeichert, anstatt in den ViewState serialisiert und an den Browser und zurück gesendet zu werden.

Ich stimme zu, dass es Probleme mit einer Liste<> in viewstate gibt, aber es funktioniert. Beachten Sie, dass es dafür keinen Setter gibt. Sie benötigen einen Verweis auf das Listenobjektobjekt, und Ihre get-Methode kann bei Bedarf eine Liste neu erstellen.

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

        return (List<myClass>)ViewState["myClass"];
    }
}

Eine Möglichkeit, das Größenproblem mit einer generischen Liste zu überwinden, besteht darin, es in ViewState als basisdem Arraytyp beizubehalten:

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();
    }
}