vistas vista ventana una parciales parcial net mvc multiples modelos modal llamar desde con como boton asp c# asp.net-mvc-3 caching partial-views outputcache

c# - ventana - vista parciales mvc



Inhabilitar el almacenamiento en caché en una vista parcial en MVC 3 (5)

Lo que estás buscando se llama Donut Caching. Aquí hay un excelente artículo explicando qué es y cómo hacerlo funcionar http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3

Tengo un problema con una vista parcial que se almacena en caché cuando no debería ser. Esta vista parcial se usa para mostrar el inicio / cierre de sesión en una página. Utiliza el código simple a continuación para descubrir qué enlace mostrar

@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 se llama desde todas las páginas en mi aplicación MVC3, usando

@Html.Partial("_HeaderView")

En la mayoría de mis controladores, tengo el caché de salida definido, por lo que 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 sea la vista parcial. 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?


Puede desactivar el almacenamiento en caché decorando el controlador que muestra su parcial _HeaderView con lo siguiente:

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


Deberíamos 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 deshabilitar el almacenamiento en caché de su acción que devuelve vista parcial [_HeaderView], puede anular la configuración de caché de configuración decorando ese método de acción específico como se muestra a continuación:

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

Espero que esto te ayude!


esto funciona para mí ...

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


Tardó un poco en descifrar esto luego de regresar a 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 { }