【问题标题】:Dynamic text being stored in viewstate存储在视图状态中的动态文本
【发布时间】:2010-08-19 11:21:19
【问题描述】:

我的 asp.net 应用程序有一个函数,它通过从数据库中获取导航菜单来为用户返回 HTML

目前,我在会话开始时将文本存储在会话变量中,然后使用它在 on_load 方法上设置导航 div 的 innerHtml。

问题是页面现在包含

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPD..

值为 7000 个字符长。

有没有更好的方法来做到这一点或不同的方法来存储和检索值而不将它们存储在视图状态中?

代码是这样的:

Session["menuHTML"] = (new NavMenu().GetMenuHTML());
navMenuDiv.InnerHtml = Session["menuHTML"].ToString();

div被声明为

<div id="navMenuDiv" class="navMenuDiv" runat="server"></div>

【问题讨论】:

    标签: c# asp.net html viewstate


    【解决方案1】:

    我会缓存从您的数据库调用返回的数据,然后为每个页面生成导航 html,因为这是您不想一遍又一遍地进行的 db 调用。

    要缓存数据,我会这样做(没有尝试过):

    public NavData GetNavData()
    {
        NavData navdata = Cache["NavData"];
        if (navdata == null)
        {
            navdata = SomeDataStore.GetNavDataFromDatabase();
            Cache["NavData"] = navdata;
        }
        return navdata;
    }
    

    不过,在回答您的问题时,您是否确定您将其放在 Session 而不是 ViewState 中?

    编辑:因为您已将该 div 转换为服务器控件,所以它将其值存储在 ViewState 中。

    为 navMenuDiv 关闭 ViewState:

    navMenuDiv.EnableViewState = false;
    

    【讨论】:

    • 是的。这就是我在 session_start 代码中的内容。 Session["menuHTML"] = (new NavMenu().GetMenuHTML())
    • 你将如何“缓存数据”?
    • 每个使用该应用程序的用户的缓存是否不同?因为生成的菜单是根据用户的权限级别来的
    • 啊,不。在这种情况下,数据需要进入会话,这使我们巧妙地解决了您最初的问题。
    • 已编辑以显示代码。它是一个递归函数。在 menuCode.appendFormat 区域进行递归调用
    【解决方案2】:

    在您的 div 中使用 EnableViewState=”false”:

    <div id="navMenuDiv" class="navMenuDiv" runat="server" EnableViewState=”false”></div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多