ViewState——在集合中存储数据的正确方式

本文关键字:方式 数据 存储 集合 ViewState | 更新日期: 2023-09-27 18:06:02

假设我有一个对象集合

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

和一个字典,这些对象将被插入

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

List和dictionary存储在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;
    }
}

ViewState——在集合中存储数据的正确方式

对象的标识符是否更内存友好字典,并在以后需要时将它们与对象绑定?

如果你说的"内存友好"是指"更小的视图状态",那么更小的页面大小,更快的渲染,更有效的浏览器操作…

是的,只存储复杂类型的ID将导致ViewState字符串小于序列化整个对象图。这是很好的,你正在考虑这一点,而不是盲目地把东西放入ViewState(一个常见的错误)。

两件事:

  • ViewState不是不受篡改的,所以攻击者可以尝试提交他们没有访问权限的对象的id。你可以用EnableViewStateMac作为威慑。我仍然会手动验证关键id,以确保用户可以访问它们。

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