没有用于UserControl的OutputCache

时间:2012-04-03 09:43:23

标签: asp.net user-controls outputcache

我有一个页面,其中列出了数据库中的大量产品。在同一页面上,我有一些登录用户的信息。此信息位于UserControl中。 (无法将带有产品的列表放在UserControl中:))

所以我将它设置在页面顶部以缓存页面

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

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

我看了一下Substitution Blocks。但似乎这只适用于文本?

谢谢,

文森特

2 个答案:

答案 0 :(得分:4)

来自MSDN

  

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

     

实现缓存后替换有三种方法:

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

  •   
  • 以编程方式,使用替换控制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");

答案 1 :(得分:0)

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

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

现在Cache基于VaryByparamVaryByParam可以拥有UserID。