C# 如何将对象列表存储到ViewState中

C# 如何将对象列表存储到ViewState中,c#,asp.net,.net,list,viewstate,C#,Asp.net,.net,List,Viewstate,我有一个类型为list的列表。我想将其存储在ViewState中。如何做到这一点 private List<JobSeeker> JobSeekersList { get; set; } private List JobSeekersList{get;set;} 基本上,您只需要使用get,然后在get上,您可以从视图状态获取发布的数据,或者第一次在视图状态上设置它。这是一个更健壮的代码,可以避免每次调用时的所有检查(查看状态集、存在等),并直接保存和使用视图状态对象 // usi

我有一个类型为
list
的列表。我想将其存储在ViewState中。如何做到这一点

private List<JobSeeker> JobSeekersList { get; set; }
private List JobSeekersList{get;set;}

基本上,您只需要使用
get
,然后在get上,您可以从视图状态获取发布的数据,或者第一次在视图状态上设置它。这是一个更健壮的代码,可以避免每次调用时的所有检查(查看状态集、存在等),并直接保存和使用视图状态对象

// using this const you avoid bugs in mispelling the correct key.
const string cJobSeekerNameConst = "JobSeeker_cnst";

public List<JobSeeker> JobSeekersList
{
    get
    {
        // check if not exist to make new (normally before the post back)
        // and at the same time check that you did not use the same viewstate for other object
        if (!(ViewState[cJobSeekerNameConst] is List<JobSeeker>))
        {
            // need to fix the memory and added to viewstate
            ViewState[cJobSeekerNameConst] = new List<JobSeeker>();
        }

        return (List<JobSeeker>)ViewState[cJobSeekerNameConst];
    }
}
求职者
类必须是
[Serializable]
as

[Serializable]
public class JobSeeker
{
    public int ID;
    ...
}
你可以简单地把它作为一个对象来调用,它永远不会为空。还将在回发后返回保存在viewstate上的值

JobSeekersList.add(new JobSeeker(){ID=1});
var myID = JobSeekersList[0].ID;
私有IList作业搜索列表
{
得到
{
//为了不破坏SRP,最好将检查逻辑移出getter
将ViewState[“key”]返回为列表;
}
设置
{
视图状态[“键”]=值;
}
}

操作员
作为
=空
is
cast更有效
@abatishchev@abatishchev谢谢你的留言,我会查出来的。您如何定义更高效的
?乙醚代码不起作用。有更多的延迟,更多的装配运行吗?可以失败吗?@abatishchev我读了那篇文章,“我不明白”为什么
在我的例子中是无效的-我用它来再次检查对象是否已经设置,如果设置了,那么它必须与我不想设置的对象相同。与您在页面上给出的示例不同。使用此代码,您需要再次检查列表是否确实存在,或者是否已完成回发,然后将其设置为viewstate。我的意思是,这里您还需要在JobSeekersList的句柄上编写更多的代码,因为您没有按原样将其保存在viewstate上。@Aristos:我知道,但否则它将打破单一责任原则-一种方法将同时执行保存和检查,这不是最佳解决方案。因此,最好将签出逻辑移出,并将该属性仅用作视图状态管理器。如果需要,“原则”将被打破。如果您想将其保存到viewstate,则不需要产生任何错误并覆盖它,请重新检查iPost back(如果存在)等。将其放在您的内部可以避免错误。@Aristos:btw我的初始代码正在执行这种检查。它只是在使用另一个操作符来实现同样的功能。但是现在我编辑它来明确强调我的观点。@Aristos:2个不同的getter可能有不同的“需要”:一个想要创建一个列表,另一个不想要。为了避免这种情况,您不需要为属性添加任何额外的逻辑,让它保持轻量级,只满足一种需求。
JobSeekersList.add(new JobSeeker(){ID=1});
var myID = JobSeekersList[0].ID;
private IList<JobSeeker> JobSeekersList
{
    get
    {
        // to do not break SRP it's better to move check logic out of the getter
        return ViewState["key"] as List<JobSeeker>;
    }
    set
    {
        ViewState["key"] = value;
    }
}