我是ASP.NET的新手,我遇到了问题...
当我想要缓存I View或这样的Action时:
<%@ Page title="" language="C#" masterpagefile="~/Views/Shared/MemberHome.Master" inherits="System.Web.Mvc.ViewPage<IndexViewData>" %>
<%@ OutputCache duration="400" varybyparam="divId;regionId;page" %>
我知道它会缓存我页面中的所有数据......但是在我的页面中我有这样的条件:
<% if(Request.IsAuthenticated) { %>
<a href="/fr/Advertiser/Search"><img src="/content/images/v_2/bot.jpg" alt="Entreprises liées à vos passions" title="Entreprises liées à vos passions" /></a>
<% } else { %>
<a href="/fr/Advertiser/OpenSearch"><img src="/content/images/v_2/bot.jpg" alt="Entreprises liées à vos passions" title="Entreprises liées à vos passions" /></a>
<% } %>
我不想缓存这个变量:Request.IsAuthenticated ...因为某些结果取决于这个条件......我尝试scottgu的甜甜圈缓存,但它返回(我认为)只是一些文字而不是bool ... http://weblogs.asp.net/scottgu/archive/2006/11/28/tip-trick-implement-donut-caching-with-the-asp-net-2-0-output-cache-substitution-feature.aspx
现在我已经厌倦了尝试任何我想到的东西..你能帮我一下! :)
于连。
答案 0 :(得分:3)
首先,在MVC应用程序中,不在视图上使用<%@ OutputCache %>
指令。缓存应该在控制器级别完成,而不是在视图级别完成。使用[OutputCache]
属性代替<%@ OutputCache %>
。有关如何执行此操作的示例,请参阅http://www.asp.net/learn/mvc/tutorial-15-cs.aspx。
您可以将OutputCacheAttribute.VaryByCustom
属性设置为某个自定义值,并通过覆盖GetVaryByCustomString方法从Global.asax进行检查。
[OutputCache]
而不是<%@ OutputCache %>
,但总体思路是相同的。并且您可能希望返回“已验证”或“未经验证”,因为这是您需要的所有粒度;它似乎不需要实际登录的用户名。 (无论如何,每个用户的输出缓存通常都是一个坏主意,因为如果许多用户登录,您将快速填充缓存。)
特别值得注意的是,不在MVC应用程序中使用Response.WriteSubstitution()。 Response.WriteSubstitution()是一个WebForms特定的可扩展点,由于MVC不完整地运行WebForms管道,因此它在MVC应用程序中的行为是未定义的。无法保证它能正常工作。
答案 1 :(得分:1)
根据定义,您正在缓存页面,并且不会修改生成的页面。因此,一旦使用Request.IsAuthenticated == True
缓存它,它将继续显示该结果,并且在缓存过期或您出现的其他条件指示它之前不会重新生成。我认为,如果你的缓存,你需要的是两个不同的页面:一个用于经过身份验证的用户,另一个用于未经身份验证的用户。