C# ViewState—在集合中存储数据的正确方法

C# ViewState—在集合中存储数据的正确方法,c#,asp.net,performance,viewstate,C#,Asp.net,Performance,Viewstate,假设我有一个对象集合 List<MyClass> collection = new List<MyClass>(); 据我所知,不会有性能提升,因为在第一种情况下,字典将包含大小为32/64位的引用。这是真的吗 编辑 MyClass是一个类,而不是一个结构。 列表和字典声明如下: private List<MyClass> A { get { if (ViewState["a"] == null) {

假设我有一个对象集合

List<MyClass> collection = new List<MyClass>();
据我所知,不会有性能提升,因为在第一种情况下,字典将包含大小为32/64位的引用。这是真的吗

编辑

MyClass
是一个类,而不是一个结构。 列表和字典声明如下:

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;
    }
}
私有列表A
{
得到
{
如果(ViewState[“a”]==null)
{
ViewState[“a”]=//从数据库检索数据
}
返回(列表)视图状态[“a”];
}
设置
{
ViewState[“a”]=值;
}
}
私人词典B
{
得到
{
如果(ViewState[“b”]==null)
{
ViewState[“b”]=新字典();
}
返回(字典)视图状态[“b”];
}
设置
{
视图状态[“b”]=值;
}
}
将对象的标识符存储在内存中是否更方便 当我需要的时候,我可以用字典和对象绑定它们吗

Dictionary<string, List<int>> sections = new Dictionary<string, List<int>>();
// example of insertion
sections["A"].Add(collection[2].ID);
如果“内存友好”的意思是“更小的视图状态”,那么页面大小更小,渲染速度更快,浏览器操作更高效

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

两件事:

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

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


是,如果
MyClass
class
,而不是
struct
,那么对象存放在哪里?它们将在页面发送到客户端后被销毁,因此即使您在viewstate中保留对它们的引用,它们也不会指向回程中的任何有效内容。因此,您很可能需要将它们保持在会话中,并且一旦将它们保持在会话中,就不需要在viewstate中有任何东西来引用它们。我不相信这会起作用,尽管我没有尝试过。要使其工作,您需要将整个对象置于viewstate中,或者将对象保持在往返服务器时可以引用的状态。如果对象保持在viewstate中,那么将有大量信息往返发送到客户端。如果要在两次行程之间保持对象的活动状态,那么实际上不需要在viewstate中有引用,因为它已经在会话中了。在这两种情况下,我都不知道在这种情况下使用viewstate是否有意义。是的,我的意思就是这样。谢谢你的详细回答。
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;
    }
}