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

我有一个List类型的List 。 我想将它存储在ViewState中。 怎么做到这一点?

 private List JobSeekersList { get; set; } 

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

 // using this const you avoid bugs in mispelling the correct key. const string cJobSeekerNameConst = "JobSeeker_cnst"; public List 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)) { // need to fix the memory and added to viewstate ViewState[cJobSeekerNameConst] = new List(); } return (List)ViewState[cJobSeekerNameConst]; } } 

避免使用的替代方案

 // using this const you avoid bugs in mispelling the correct key. const string cJobSeekerNameConst = "JobSeeker_cnst"; public List JobSeekersList { get { // If not on the viewstate then add it if (ViewState[cJobSeekerNameConst] == null) ViewState[cJobSeekerNameConst] = new List(); // 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); return (List)ViewState[cJobSeekerNameConst]; } } 

并且JobSeeker类必须是[Serializable] as

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

并且您通常将其简单地称为对象,并且永远不会为null。 也会在回发后返回保存的viewstate值

 JobSeekersList.add(new JobSeeker(){ID=1}); var myID = JobSeekersList[0].ID; 
 private IList JobSeekersList { get { // to do not break SRP it's better to move check logic out of the getter return ViewState["key"] as List; } set { ViewState["key"] = value; } }