我试图将一个通用列表存储在一个viewstate支持的属性中,如下所示:
[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;
}
}
当我尝试将项目添加到列表时,UploadedFiles.Count保持为零:
var uploadedFile = new UploadedFile {FileName = args.FileName, FileGuid = args.FileGuid};
UploadedFiles.Add(uploadedFile); // UploadedFiles.Count == 0 here!
这里有人有想法吗?
答案 0 :(得分:3)
创建初始列表时,不要将其保存到viewstate中,试试这个..
public List<UploadedFile> UploadedFiles
{
get
{
var list = (List<UploadedFile>) (ViewState["UploadedFiles"] ??
new List<UploadedFile>());
ViewState["UploadedFiles"] = list;
return list;
}
set
{
ViewState["UploadedFiles"] = value;
}
}
答案 1 :(得分:2)
你在这里真正做的是获取属性(最初将返回一个新的List)然后在新列表中添加一些内容,我认为这实际上就是你想做的事情:
List<UploadedFile> list = UploadedFiles;
list.Add(uploadedFile);
UploadedFiles = list;
这将在修改列表后写回ViewState。
答案 2 :(得分:2)
为了让生活更轻松,我通常只是做这样的事情来跟踪对象的ViewState。然后,当您在代码中的其他位置引用它时,您不需要任何特殊处理。
// 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"];
}
}
答案 3 :(得分:0)
私人名单Lista
set
{
ViewState.Add("Lista", value);
}
get
{
return ViewState["Lista"] != null ? (List<UploadedFile>)ViewState["Lista"] : null;
}
}