ViewState - 在集合中存储数据的正确方法

时间:2013-03-27 14:48:39

标签: c# asp.net performance viewstate

假设我有一个对象集合

List<MyClass> collection = new List<MyClass>();

将插入这些对象的字典

Dictionary<string, List<MyClass>> sections = new Dictionary<string, List<MyClass>>();
// example of insertion
sections["A"].Add(collection[2]);

列表和字典存储在ViewState中。在我需要时,将对象的标识符存储在字典中并将它们与对象绑定在一起是否会更加内存友好?

Dictionary<string, List<int>> sections = new Dictionary<string, List<int>>();
// example of insertion
sections["A"].Add(collection[2].ID);

据我所知,没有性能提升,因为在第一种情况下,字典将包含大小为32/64位的引用。这是真的吗?

修改

MyClass是一个类,而不是结构。 List和Dictionary声明如下:

private List<MyClass> A
{
    get
    {
        if (ViewState["a"] == null)
        {
            ViewState["a"] = // retrieve data from db
        }
        return (List<MyClass>)ViewState["a"];
    }
    set
    {
        ViewState["a"] = value;
    }
}

private Dictionary<string, List<MyClass>> B
{
    get
    {
        if (ViewState["b"] == null)
        {
            ViewState["b"] = new Dictionary<string, List<MyClass>>();
        }
        return (Dictionary<string, List<MyClass>>)ViewState["b"];
    }
    set
    {
        ViewState["b"] = value;
    }
}

1 个答案:

答案 0 :(得分:0)

  

存储对象的标识符会更加内存友好吗?   字典并在以后将它们与对象绑定,当我需要它们时?

如果“内存友好”,则表示“较小的视图状态”,因此页面尺寸较小,渲染速度更快,浏览器操作更有效......

是的,仅存储复杂类型的ID将导致ViewState字符串小于序列化整个对象图。您正在考虑这一点并且不要盲目地将事物放入ViewState(这是一个常见的错误),这是很好的。

夫妻俩:

  • ViewState不能免于篡改,因此攻击者可能会尝试提交他们无权访问的对象的ID。您可以使用EnableViewStateMac作为威慑。我仍然会手动验证关键ID,以确保用户可以访问它们。

  • 如果经常使用这些对象,最好将它们存储在SessionCache中,而不是多次调用数据库。