3

我有一个 ASP.NET 页面,我试图在其中进行一些输出缓存,但遇到了问题。我的 ASPX 页面有

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MYProject._Default" %>
<%@ OutputCache Duration="600" VaryByParam="None" %>
<%@ Register TagPrefix="MYProjectUC" TagName="PageHeader" Src="~/Lib/UserControls/PageHeader.ascx" %>
<%@ Register TagPrefix="MYProjectUC" TagName="PageFooter" Src="~/Lib/UserControls/PageFooter.ascx" %>

我在 ASPX 页面中有一个名为“PageHeader”的用户控件。在PageHeader.ascx中,我有一个 ASP.NETSubstitution控件,我想在其中显示一些基于登录用户的链接。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PageHeader.ascx.cs" Inherits="MyProject.Lib.UserControls.PageHeader1" %>
<div class="headerRow">
    <div class="headerLogo">
        <a href="Default.aspx"><img src="Lib/Images/header.gif" alt=""></a>
    </div>
    <div id="divHeaderMenu" runat="server">         
        <asp:Substitution ID="subLinks" runat="server" MethodName="GetUserProfileHeaderLinks" />
    </div>   
</div><!--headerRow-->

在我的用户控件代码隐藏中,我有一个静态方法,它将根据使用的是否登录或不使用会话返回一个字符串:

public static string GetUserProfileHeaderLinks(HttpContext context)
{
    string strHeaderLinks = string.Empty;
    // check session and return string
    return strHeaderLinks;
}

但是该页面仍然为登录用户和访客用户显示相同的内容。

我的目标是让页面被缓存,除了替换控件中的内容。我该怎么做呢?

4

2 回答 2

1

您将要缓存页面的多个版本。您将需要一个用于登录视图和一个用于访客视图。您可以通过 VaryByParams 或 VaryByHeaders 设置两个不同的视图。

http://msdn.microsoft.com/en-us/library/aa719665%28v=VS.71%29.aspx

于 2010-04-08T16:51:39.873 回答
0

根据您使用 Session 的评论,知道这是 Substitution 控件的常见问题: Session 在设计上在回调方法中不可用。(它在 Context 实例中列出,但始终为空。)

请参阅如何在 Substitution 控件中使用 ASP.Net 服务器控件的答案?一种方法来做到这一点 - 虽然我已经仔细检查过渲染控制黑客是否初始化了会话......

于 2011-10-19T17:43:23.480 回答