【问题标题】:How to store list of object into ViewState如何将对象列表存储到 ViewState 中
【发布时间】:2012-11-06 10:21:30
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net .net list viewstate


    【解决方案1】:

    基本上你只需要使用 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] as

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

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

    JobSeekersList.add(new JobSeeker(){ID=1});
    var myID = JobSeekersList[0].ID;
    

    【讨论】:

    • 运算符as!=nulliscast 更有效。
    • @abatishchev @abatishchev 感谢您的注意,我会检查一下。您如何定义 are more efficient ?代码以太不工作。有更多的延迟,更多的装配运行?会失败吗?
    • @abatishchev 我读了那篇文章,“我不明白”为什么 is 在我的情况下效率不高 - 我用它来仔细检查对象是否已设置,是否已设置然后设置必须与我不会设置的相同。与您提供的页面上的示例不同。
    【解决方案2】:
    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;
        }
    }
    

    【讨论】:

    • 使用这段代码,您需要仔细检查列表是否确实存在,或者是否已完成回发,然后将其设置为视图状态。我的意思是,这里你还需要在 JobSeekersList 的句柄上编写更多代码,因为你没有将它保存在视图状态中。
    • @Aristos:我知道,否则它会破坏单一责任原则 - 一种方法将执行保存和检查,这不是最好的解决方案。因此,最好将检查逻辑移出,并将该属性仅用作视图状态管理器。
    • 如果需要,“原则”会被打破。如果您想将其保存到视图状态,则无需犯任何错误并覆盖它,请仔细检查 ispost 是否存在等。将其放置在内部可以避免错误。
    • @Aristos:顺便说一句,我的初始代码正在执行此类检查。它只是在使用另一个运算符。但现在我对其进行了编辑以明确强调我的观点。
    • @Aristos:2 个不同的 getter 可能有不同的“想要”:一个想要创建列表,另一个不想要。为避免这种情况,您不要在属性中添加任何额外的逻辑,而是让它轻量级并且只满足一个需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2013-11-13
    • 2021-12-13
    • 2010-12-29
    相关资源
    最近更新 更多