我有一个页面,其中列出了数据库中的大量产品。在同一页面上,我有一些登录用户的信息。此信息位于UserControl中。 (无法将带有产品的列表放在UserControl中:))
所以我将它设置在页面顶部以缓存页面
<%@ OutputCache Duration="200"
Location="Any"
VaryByParam="none"
%>
但是因为这会缓存整个页面,所以带有用户信息的UserControl也会被缓存。 是否可以仅为UserControl禁用缓存,而不是为页面的其余部分禁用缓存?
我看了一下Substitution Blocks。但似乎这只适用于文本?
谢谢,
文森特
答案 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
基于VaryByparam
。 VaryByParam
可以拥有UserID。