【问题标题】:No OutputCache for UserControl没有用于 UserControl 的 OutputCache
【发布时间】:2012-04-03 09:43:22
【问题描述】:

我有一个页面,其中列出了数据库中的许多产品。在同一页面上,我有一些登录用户的信息。此信息位于用户控件中。 (不可能将产品列表放在 UserControl 中:))

所以我在页面顶部设置了这个来缓存页面

<%@ OutputCache Duration="200"
   Location="Any"
   VaryByParam="none"
%>

但是因为这会缓存整个页面,所以带有用户信息的 UserControl 也会被缓存。 是否可以仅对 UserControl 禁用缓存,而不对页面的其余部分禁用缓存?

我查看了替换块。但这似乎只适用于文本?

谢谢,

文森特

【问题讨论】:

    标签: asp.net user-controls outputcache


    【解决方案1】:

    来自MSDN

    为了允许您缓存页面但动态替换某些内容, 您可以使用 ASP.NET 后缓存替换。使用后缓存 替换,整个页面与特定部分缓存输出 标记为免于缓存。在广告横幅的示例中, AdRotator 控件允许您利用后缓存 替换,以便为每个用户动态创建广告 每次页面刷新。

    实现缓存后替换的三种方式:

    • 以声明方式,使用 Substitution 控件。

    • 以编程方式,使用 Substitution 控制 API。

    • 隐式使用 AdRotator 控件。

    我认为最好的选择是使用Substitution 控件。为此,将Substitution 控件添加到您的页面,并设置其MethodName 属性:

    <asp:Substitution runat="server" MethodName="GetUserInfo"></asp:substitution>
    

    现在将GetUserInfo 方法添加到您的页面。 Substitution控件调用该方法获取用户信息:

    public static string GetUserInfo(HttpContext context)
    {
        // return rendered user control
    }
    

    剩下的就是将你的用户控件渲染成一个字符串。为此,您可以使用 Scott Guthrie 在Tip/Trick: Cool UI Templating Technique to use with ASP.NET AJAX for non-UpdatePanel scenarios 文章中提出的技术。在这种情况下,要呈现用户控件,只需使用以下内容:

    return ViewManager.RenderView("UserInfo.ascx");
    

    【讨论】:

      【解决方案2】:

      将产品列表放在Session 中。现在可以从应用程序的任何位置访问它。

      YourColectionClass variable = Session["Sessionvariable"] == null ? 
                  ClassObject.DatabaseFunction(Params) : 
                  (YourColectionClass)Session["Sessionvariable"];
      

      现在Cache它在VaryByparam的基础上。 VaryByParam 可以有 UserID。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 2012-07-23
        • 2012-09-01
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        相关资源
        最近更新 更多