2011-01-05 2 views
3

ich eine generische Liste in einer Ansichtszustand gesicherte Eigenschaft zu speichern versuchen wie folgt:Viewstate Backed Property Arbeiten nicht für Liste <T>

[Serializable] 
    public class UploadedFile 
    { 
     public string FileName { get; set; } 
     public Guid FileGuid { get; set; } 
    } 

    public List<UploadedFile> UploadedFiles 
    { 
     get 
     { 
     return (List<UploadedFile>) (ViewState["UploadedFiles"] ?? new List<UploadedFile>()); 
     } 
     set 
     { 
     ViewState["UploadedFiles"] = value; 
     } 
    } 

Wenn ich versuche, ein Element in die Liste hinzuzufügen, die UploadedFiles.Count bleibt Null:

var uploadedFile = new UploadedFile {FileName = args.FileName, FileGuid = args.FileGuid}; 
UploadedFiles.Add(uploadedFile); // UploadedFiles.Count == 0 here! 

Wer hat hier eine Idee?

Antwort

3

Wenn Sie die erste Liste zu erstellen, speichern Sie nicht, es in Ansichtszustand, versuchen Sie dies ..

public List<UploadedFile> UploadedFiles  
{  
    get  
    {   
     var list = (List<UploadedFile>) (ViewState["UploadedFiles"] ?? 
      new List<UploadedFile>()); 
     ViewState["UploadedFiles"] = list; 
     return list;  
    }  
    set  
    {   
     ViewState["UploadedFiles"] = value;  
    }  
} 
+0

Das funktioniert perfekt und genau das, was ich wollte. Danke, Richard. Entschuldigung, Jackson;) –

2

Was bist du eigentlich hier tun, ist die Eigenschaft bekommen (die zunächst eine neue Liste zurück) und dann auf die neue Liste hinzugefügt haben etwas, ich denke, das eigentlich ist, was Sie tun möchten:

List<UploadedFile> list = UploadedFiles; 
list.Add(uploadedFile); 
UploadedFiles = list; 

Dies wird nach dem Ändern der Liste in den ViewState zurückgeschrieben.

+0

Brilliant. Vielen Dank! –

2

Um das Leben einfacher zu machen, mache ich normalerweise so etwas, um ViewState nach Objekten zu verfolgen. Dann brauchen Sie keine besondere Handhabung, wenn Sie sich an anderer Stelle im Code darauf beziehen.

// Lazy loading object 
protected List<string> ItemList { 
    get { 
     if (_ItemList==null) { 
      _ItemList = new List<string>(); 
     } 
     return(_ItemList); 
    } 
} 
protected list<string> _ItemList=null; 

// Save & Load it to viewstate as needed 
protected override object SaveViewState() 
{ 
    if (_ItemList != null) 
    { 
     ViewState["ItemList"] = ItemList; 
    } 
    return base.SaveViewState(); 
} 
protected override void LoadViewState(object savedState) 
{ 
    base.LoadViewState(savedState); 

    if (ViewState["ItemList"] != null) 
    { 
     _ItemList = (List<string>)ViewState["ItemList"]; 
    } 
} 
0

private List Lista

set 

    { 

     ViewState.Add("Lista", value); 

    } 

    get 

    { 

     return ViewState["Lista"] != null ? (List<UploadedFile>)ViewState["Lista"] : null; 

    } 

} 
Verwandte Themen