【问题标题】:Remove UserControls from occuping space in ViewState删除用户控件占用 ViewState 中的空间
【发布时间】:2012-05-18 10:42:18
【问题描述】:

我有一个管理员和会员页面。两者共享同一页面。唯一的区别是 Admin 看到的 UserControl 与 Member 不同。目前我正在这样做:

ucControl.Visible = false;

为会员。这行得通。但它的效率非常低。它查询数据库并遵循正常的生命周期,它确实占用了 ViewState 中的空间。我该如何解决这个问题并使其更高效,这样它就不会查询数据库,也不会不必要地占用 ViewState 中的空间。

【问题讨论】:

    标签: c# asp.net viewstate web-controls


    【解决方案1】:

    制作

    EnableViewState = "false"
    

    为此控件。 除了使它们不可见之外,我还会禁用此控件。

    【讨论】:

    • 这不会停止用户控件的生命周期。可以?它仍然会执行并查询我的数据库。
    • 我在 UserControl 中看到了一个名为 Dispose 的方法。如果我称之为生命周期停止并且也不会占用 ViewState 中的空间。但是,我不确定它的含义。
    • 是的,这会将它们从视图状态中删除,但是一旦您禁用它,它也会删除查询。
    • 处理对象不是最好的方法,因为有很多内部的东西。只需尝试在 Paren OnLoad 事件中禁用它们。
    • 我真的不知道你所说的禁用是什么意思。用户控件中没有任何禁用属性或方法。
    【解决方案2】:

    使用占位符并动态加载控件 - 唯一的问题是如果您需要使用回发并记住数据,那么它开始变得有点棘手。

    【讨论】:

    • 我知道这就是为什么我没有采用这种方法,但我仍然不会;)
    【解决方案3】:

    只需向 UserControl 添加代码,该代码仅在可见时查询 db 等。

    您可能希望在初始化阶段设置ucControl.Visible - 大概到此阶段您就知道用户是会员还是管理员。然后您可以简单地测试 UserControl 的 Page_Load 中的可见性。

    回复评论:

    是的,我将它设置在初始化阶段并检查可见性。我是否也在 page_load 本身中禁用视图状态?如果我发现用户是会员?

    如果用户是成员(即控件不可见),则不要执行任何操作。这样,UserControl 不会对 ViewState 做出贡献:

    // inside the UserControl's Page_Load method
    if (this.Visible)
    {
        // The user is an Admin, do whatever is needed (access database, databind, ...)
        ...
    }
    else
    {
        // The user is a Member, this UserControl is not used, do nothing.
    }
    

    【讨论】:

    • 是的,我将它设置在初始化阶段并检查可见性。我是否也在 page_load 本身中禁用视图状态?如果我发现用户是会员?
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2015-09-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多