2012-01-09 15 views
19

Tengo un problema con una vista parcial que se almacena en caché cuando no debería. Esta vista parcial se usa para mostrar el inicio/cierre de sesión en una página. Se utiliza el código simple de abajo para averiguar qué enlace para mostrarInhabilitar el almacenamiento en caché en una vista parcial en 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> 
} 

Este Vista parcial se denomina a partir de todas las páginas en mi solicitud MVC3, utilizando

@Html.Partial("_HeaderView") 

En la mayoría de mis controladores, tengo el caché de salida definido, así puedo aprovechar el almacenamiento en caché de mi contenido.

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

Ahora mi problema es que toda la página está en caché cuando no quiero que la vista parcial sea. Esto está causando un comportamiento incorrecto, en el que a veces aparece LogOff incluso si el usuario no ha iniciado sesión, etc. ¿Hay alguna manera de almacenar en caché todo el contenido, excepto la vista parcial en cuestión?

+0

Nick, lo siento, tuve que añadir el comentario aquí. De todos modos, funciona cuando elimino el Nostore y cambie la duración a 1. El único problema ahora es cuando el usuario inicia sesión, se llevan a la página de inicio, pero tengo que actualizarla explícitamente para que los cambios surtan efecto (para mostrar el cierre de sesión en lugar de iniciar sesión). – SimpleUser

Respuesta

9

Lo que usted está buscando se llama dona almacenamiento en caché. Aquí hay un gran artículo que explica qué es y cómo hacerlo funcionar http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3

+0

Probé este, pero no funcionó para mí como se esperaba. Todavía tenía los mismos problemas que usar el atributo outputcache en la acción parcial, es decir, actualizar la página de inicio de forma manual. – SimpleUser

+0

Me encantaría ayudar, pero no ver el código que tenías va a ser difícil :) Sin embargo, me funcionó. Cuando realices la prueba, recuerda la configuración correcta del navegador (a veces anulan la configuración del servidor y, en caso de falsa impresión, algo no funciona) – torm

+0

No, era solo que yo estaba pasando un momento muy lento. Trabajar con gripe obviamente no es una buena idea. Pero esto funciona ahora. Gracias por su ayuda – SimpleUser

18

Puede deshabilitar el almacenamiento en caché mediante la decoración del controlador que muestra su _HeaderView parcial con lo siguiente:

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

Hola Nick. Gracias por tu contribución. Pero no tengo una acción de controlador asociada con la vista parcial (por ahora de todos modos). Lo estoy llamando usando Html.Partial(). ¿La única solución para tener una acción de controlador con lo anterior? – SimpleUser

+0

Quizás podría agregar un controlador compartido y agregar una acción HeaderView que devuelva PartialView ("_ HeaderView"); y está decorado con la anotación en mi respuesta anterior. Con suerte, esto le dará el control que necesita y no es un cambio masivo. Avíseme si eso funciona para usted o si necesita más aclaraciones. – Nick

+0

Gracias Nick.Implementaré los cambios y te haré saber cómo funciona. – SimpleUser

3

Debemos establecer el perfil de caché en el archivo Web.config en lugar de establecer los valores de caché individualmente en las páginas para evitar el código redundante. Podemos referir el perfil utilizando la propiedad CacheProfile del atributo OutputCache. Este perfil de caché se aplicará a todas las páginas a menos que la página/método anule estas configuraciones.

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

Y si desea desactivar el almacenamiento en caché de su acción que devuelve vista parcial [_HeaderView], se puede anular la configuración de caché de configuración mediante la decoración de ese método de acción específica, como se muestra a continuación:

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

Espero que esto te ayude!

1

este trabajo para mí ..

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

+1 Probé todas las otras soluciones, no funcionaron bien, esto funcionó como un encanto para mí ... Gracias :) Nota: No tuve que usar AuthenticationManager.Signout(). –

0

Tomó un poco de tiempo a la forma de saberlo después de volver a meterse en la MVC. Simplemente ponga la configuración de caché directamente en la vista de encabezado parcial. Al igual que cuando se muestra el nombre de usuario. No es necesario un código global o del lado del servidor. El único problema es que una vez que una página se almacena en caché, no se actualizará inmediatamente después de iniciar sesión. Pero mantenemos la velocidad cuando es necesario en la búsqueda inicial de productos. Ok, intercambio en nuestro caso.

 

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

Cuestiones relacionadas