如何不缓存ASP.NET用户控件?

时间:2009-08-10 18:02:52

标签: asp.net caching

我在我的页面中使用OutputCache有一个用户控件,但我不想缓存这个特定的用户控件,因为它与用户登录有关(如果我访问该页面,我看到该页面就好像我与另一个用户进行了身份验证)。

我该怎么做?

3 个答案:

答案 0 :(得分:10)

我个人使用VaryByCustom属性为登录和注销用户提供不同的缓存页面视图:

<%@ OutputCache VaryByCustom="IsLoggedIn" Duration="30" VaryByParam="*" %>

然后在global.asax中放入

public override string GetVaryByCustomString(HttpContext context,
    string arg)
{
    if (arg == "IsLoggedIn")
    {

        if (context.Request.IsAuthenticated)
        {
            return "Logged in: " + context.User.Identity.Name;
        }
        else
        {
            return "Not Logged In";
        }

    }
    else
    {
        return base.GetVaryByCustomString(context, arg);
    }

}

我只想把它扔出去。替代控制怎么样?

http://msdn.microsoft.com/en-us/library/ms228212.aspx

根据msdn网站:

  

替换控制让你   在页面上创建可以的区域   然后动态更新   集成到缓存页面中。 ...   替代控制提供了一个   部分页面的简化解决方案   缓存多数人的页面   内容的缓存。您可以   输出 - 缓存整个页面,然后   使用替换控件指定   页面中可以免除的部分   来自缓存。

我从未亲自使用过替换控件,但前几天我碰巧查了一下,听起来它可以以某种方式将更新的内容注入其他缓存的页面输出。

答案 1 :(得分:1)

您可以缓存页面,并且可以缓存用户控件,但除了用户控件之外,您无法缓存页面。当用户控件运行时,必须运行整个页面。您必须使页面的输出缓存识别不同的用户。

如果用户身份存储在cookie中,您可以使用VaryByHeader="Cookie"缓存每组Cookie的页面。您可以使用VaryByCustom="SomeString"并对SomeString执行检查,以便GetVaryByCustomString中的Global.asax方法检查用户身份。

答案 2 :(得分:0)

您可以创建缓存过滤器:http://weblogs.asp.net/rashid/archive/2008/03/28/asp-net-mvc-action-filter-caching-and-compression.aspx

如果用户已登录,请检查此过滤器内部。