如何将对象列表存储到视图状态中



我有一个类型List<JobSeeker>的列表。我想将其存储在ViewState中。如何做到这一点?

private List<JobSeeker> 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];
    }
}

避免is的替代方案

// using this const you avoid bugs in mispelling the correct key.
const string cJobSeekerNameConst = "JobSeeker_cnst";
public List<JobSeeker> JobSeekersList
{
    get
    {
        // If not on the viewstate then add it
        if (ViewState[cJobSeekerNameConst] == null)                
            ViewState[cJobSeekerNameConst] = new List<JobSeeker>();
        // this code is not exist on release, but I check to be sure that I did not 
        //  overwrite this viewstate with a different object.
        Debug.Assert(ViewState[cJobSeekerNameConst] is List<JobSeeker>);
        return (List<JobSeeker>)ViewState[cJobSeekerNameConst];
    }
}

并且JobSeeker类必须[Serializable]

[Serializable]
public class JobSeeker
{
    public int ID;
    ...
}

您只需将其通常称为对象,并且永远不会为空。回发后还将返回保存的视图状态值

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