2010-03-26 108 views
1

我在ASP.NET新的,我有一個問題...Request.IsAuthenticated問題緩存在ASP.NET

當我要緩存我查看或像這樣的動作:

<%@ 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 ......因爲一些結果取決於這種情況...我嘗試了唐UT緩存由scottgu的,但它返回(我認爲),只是一些文字不是一個布爾... 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

現在,我已經厭倦了去嘗試任何東西,來我的腦海裏,你能不能幫我pleaseee! :)

Julien。

回答

1

根據定義,您正在緩存頁面,並且不會修改生成的頁面。所以一旦你用Request.IsAuthenticated == True緩存它,那麼它將繼續顯示該結果,並且直到緩存過期或你現有的其他條件指示它纔會被重新生成。我認爲,如果緩存它,你需要的是兩個不同的頁面:一個用於認證用戶,另一個用於未認證用戶。

3

首先,在MVC應用程序中,不要在視圖上使用<%@ OutputCache %>指令。緩存應該在控制器級別完成,而不是在視圖級別。使用[OutputCache]屬性而不是<%@ OutputCache %>。有關如何執行此操作的示例,請參見http://www.asp.net/learn/mvc/tutorial-15-cs.aspx

您可以將OutputCacheAttribute.VaryByCustom屬性設置爲一些自定義的值,並通過覆蓋GetVaryByCustomString方法從Global.asax中檢查。

史蒂文史密斯有這樣一個例子on his blog。請注意,他的示例針對的是WebForms而不是MVC,因此您需要使用[OutputCache]而不是<%@ OutputCache %>,但總體思路是相同的。你可能想要返回「已認證」或「未認證」,因爲這是你需要的所有粒度;它似乎並不像你需要實際登錄的用戶名。 (每個用戶的輸出緩存通常是一個壞主意無論如何,因爲你很快就會填寫您的緩存,如果許多用戶登錄。)

特別值得注意的是,使用Response.WriteSubstitution()從內MVC應用程序。 Response.WriteSubstitution()是一個WebForms特定的可擴展性點,並且它在MVC應用程序中的行爲是未定義的,因爲MVC不會完整地運行WebForms管道。不能保證它能正常工作。

+0

Haack表示可以使用WriteSubstitution作爲默認的viewengine。但還沒有嘗試過...... http://haacked.com/archive/2009/05/12/donut-hole-caching.aspx – 2010-03-28 20:55:36

+1

Phil的博客文章已過時。甚至有一部分MVC 2自述文件正式聲明Html.Substitute(並且通過擴展WriteSubstitution)是非常不好的事情。 – Levi 2010-03-29 06:55:52