2012-01-09 58 views
19

我不應該在部分視圖被緩存時出現問題。這部分視圖用於顯示頁面上的登錄/註銷。它採用簡單的代碼下面找出哪些鏈接以顯示在MVC中的局部視圖上禁用緩存3

@if(Request.IsAuthenticated) {  
    <a href="@Url.Action("LogOff", "Account", new { area = "" })">Log Off</a> 
} 
else { 
    <a href="@Url.Action("LogOn", "Account", new { area = "" })">Log On</a> 
} 

這部分觀點是從我MVC3應用程序的所有頁面調用,使用

@Html.Partial("_HeaderView") 

在大多數我的控制器,我有定義輸出緩存,所以我可以利用緩存我的內容。

[OutputCache(Duration = 86400, VaryByParam = "*")] 

現在我的問題是,當我不希望部分視圖是整個頁面被緩存。這導致錯誤的行爲,即使用戶沒有登錄,它有時也會顯示LogOff等。有沒有一種方法可以緩存除有問題的局部視圖以外的所有內容?

+0

尼克,對不起,必須在這裏添加評論。無論如何,它在我移除Nostore並將持續時間更改爲1時起作用。現在唯一的問題是當用戶登錄時,它們被帶到主頁,但我必須明確地刷新它以使更改生效(顯示註銷而不是登錄)。 – SimpleUser 2012-01-09 11:26:54

回答

9

你在找什麼叫甜甜圈緩存。下面是一篇很好的文章,解釋它是什麼以及如何使其工作http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3

+0

我確實試過這個,但它沒有按預期工作。我仍然遇到與在部分操作中使用outputcache屬性相同的問題,即手動刷新主頁。 – SimpleUser 2012-01-09 11:52:13

+0

我很樂意提供幫助,但沒有看到你的代碼會很難:)但它對我有效。當你測試時,請記住關於正確的瀏覽器設置(有時他們會覆蓋服務器設置,並且假設一些錯誤的東西不起作用) – torm 2012-01-09 12:05:46

+0

不,只是我有一個非常緩慢的時刻。與流感合作顯然不是一個好主意。但現在這個工作。感謝您的幫助 – SimpleUser 2012-01-09 12:38:17

18

您可以通過裝飾,顯示你的_HeaderView部分具有以下控制器禁用緩存:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult HeaderView() 
{ 
    return PartialView("_HeaderView"); 
} 
+0

嗨,尼克。感謝您的輸入。但是我沒有與局部視圖相關的控制器動作(現在無論如何)。我使用Html.Partial()調用它。唯一的解決方法是使用上述控制器進行操作? – SimpleUser 2012-01-09 10:31:36

+0

也許你可以添加一個共享控制器並添加一個返回PartialView(「_ HeaderView」)的HeaderView動作;並在上面的答案中加註了註釋。希望這會給你你需要的控制,而不是一個巨大的變化。讓我知道,如果這對你有用,或者你需要更多的澄清。 – Nick 2012-01-09 10:35:14

+0

謝謝尼克。我將執行這些更改並讓您知道它是如何發生的。 – SimpleUser 2012-01-09 10:36:26

3

我們應該在Web.config文件中設置緩存配置文件,而不是在頁面中單獨設置緩存值以避免冗餘代碼。我們可以使用OutputCache屬性的CacheProfile屬性來引用配置文件。此緩存配置文件將應用於所有頁面,除非頁面/方法覆蓋這些設置。

​​

如果你想禁止從你的行動,返回局部視圖[_HeaderView],您可以通過裝飾覆蓋配置緩存設置,像具體操作方法如下所示的緩存:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult RenderPartialView() 
{ 
    return PartialView("_HeaderView"); 
} 

希望這會幫助你!

1

這個工作對我來說..

public ActionResult LogOff() 
{ 
    AuthenticationManager.SignOut(); 
    var url = Url.Action("Index", "Web"); 
    HttpResponse.RemoveOutputCacheItem(url);   
    return RedirectToAction("Index", "Web"); 
} 
+0

+1我嘗試了所有其他解決方案,它們不能很好地工作,這對我來說就像一個魅力......謝謝:)注意:我沒有使用AuthenticationManager.Signout()。 – 2016-11-25 06:28:44

0

花了一些時間找回到MVC後推測這一個。只需將緩存設置直接放入部分頭視圖。就像在顯示用戶名時一樣。不需要全局或服務器端代碼。唯一的問題是一旦頁面被緩存,登錄後不會立即刷新。但是我們在初次瀏覽產品時需要保持速度。在我們的情況下折衷。

 

    @if (Request.IsAuthenticated) 
    { 
      @* when we are authenticated, don't cache any more! *@ 
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    HttpContext.Current.Response.Cache.SetNoStore(); 
    HttpContext.Current.Response.Cache.SetNoServerCaching(); 
      @*@Html.Raw(DateTime.Now.ToString())*@ 
    @Html.ActionLink("Welcome " + (String.IsNullOrEmpty(((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")) ? User.Identity.Name : ((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")), "Index", "Manage", routeValues: new { Area = "Store" }, htmlAttributes: new { title = "Manage"}) 
    } 
    else 
    { 
    }