it-swarm-pt.tech

Desativar o armazenamento em cache em uma visão parcial no MVC 3

Eu tenho um problema com um modo de exibição parcial sendo armazenado em cache quando não deveria ser. Esta vista parcial é usada para exibir o Logon/Logoff em uma página. Ele usa o código simples abaixo para descobrir qual link exibir 

@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>
}

Esta Vista parcial é chamada com todas as páginas no meu aplicativo MVC3, usando 

@Html.Partial("_HeaderView")  

Na maioria dos meus controladores, eu tenho o cache de saída definido, para que eu possa tirar proveito do cache do meu conteúdo. 

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

Agora, meu problema é que a página inteira está sendo armazenada em cache quando não quero que a exibição parcial seja. Isso está causando um comportamento incorreto, onde às vezes exibe LogOff mesmo se o usuário não estiver logado, etc. Existe uma maneira de armazenar todo o conteúdo em cache, exceto a vista parcial em questão? 

20
SimpleUser

O que você está procurando é chamado Donut Caching. Aqui está um ótimo artigo explicando o que é e como fazê-lo funcionar http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3

9
torm

Você pode desativar o armazenamento em cache decorando o controlador que exibe seu _HeaderView parcial com o seguinte:

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

Devemos definir o perfil de cache no arquivo Web.config em vez de definir valores de cache individualmente em páginas para evitar código redundante. Podemos referenciar o perfil usando a propriedade CacheProfile do atributo OutputCache. Esse perfil de cache será aplicado a todas as páginas, a menos que a página/método substitua essas configurações.

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="CacheProfile" duration="60" varyByParam="*" />
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>

E se você quiser desativar o cache de sua ação que retorna a visualização parcial [_HeaderView], você pode substituir as configurações de cache de configuração decorando esse método de ação específico, como mostrado abaixo:

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

Espero que isto te possa ajudar!

3
Swati Gupta

isso trabalhando para mim .. 

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

Demorou um pouco para descobrir isso depois de voltar ao MVC. Basta colocar a configuração de cache diretamente na visualização do cabeçalho parcial. Como quando exibindo o nome de usuário. Não há necessidade de código global ou do lado do servidor. O único problema é que uma vez que uma página é armazenada em cache, ela não será atualizada imediatamente após o login. Mas mantemos a velocidade quando necessário na navegação inicial por produtos. Ok troca no nosso caso. 

 
 @if (Request.IsAuthenticated) 
 {
 @ * quando somos autenticados, não armazenamos mais nenhum cache! * @ 
 HttpContext.Current.Response.Cache.SetCacheability (HttpCacheability.NoCache); 
 HttpContext.Current.Response.Cache.SetNoStore (); 
 HttpContext.Current.Response. Cache.SetNoServerCaching (); 
 @ * @ Html.Raw (DateTime.Now.ToString ()) * @ 
 @ Html.ActionLink ("Bem-vindo" + (String.IsNullOrEmpty (((Sistema .Security.Claims.ClaimsIdentity) User.Identity) .FindFirstValue ("UserName"))? User.Identity.Name: ((System.Security.Claims.ClaimsIdentity) User.Identity) .FindFirstValue ("UserName")), " Índice "," Gerenciar ", routeValues: novo {Area =" Store "}, htmlAttributes: novo {title =" Gerenciar "}) 
} 
 Else 
 {
} 
 
0
Jeff