2010-07-26 10 views
9

¿Cómo podría almacenar en caché toda una página, excepto un bit en la parte superior que dice algo similar a "Welcome back, Matt! | Log Out" si el usuario está conectado y así sucesivamente?ASP.NET MVC caché de salida con fragmento dinámico

estoy usando ASP.NET MVC 2.

+0

Esto a veces se llama "caché de donuts" y no es compatible con asp.net mvc 2 http://stackoverflow.com/questions/2806663/donut-caching-asp-net-mvc2 –

+0

¿Por qué? o_O ¿No hay otras soluciones factibles? –

+1

No he visto una implementación de caché de donuts. Siempre puede almacenar en caché los datos en el controlador, en lugar de almacenar en caché la salida html. –

Respuesta

6

Lo que está tratando de lograr se llama donut-caching o sustitución de caché. A partir de ASP.NET MVC 2, no hay ayuda incorporada para admitir este escenario. Por mucho que sé, era una función planificada en MVC v.1 pero se eliminó en algún lugar en el camino hacia el lanzamiento. Para obtener más información, consulte estos enlaces http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx, Is Donut Caching working properly with ASP.NET MVC?. La opción VaryByParam mencionada por Oleg aquí no es una buena idea en su caso. Si tiene VaryByParam, se colocará una versión diferente de la página en la memoria caché para cada valor diferente del parámetro (en su caso para cada nombre de usuario). Personalmente, me gustaría almacenar en caché los datos, no todo el resultado de la página.

3

probablemente ayuda

<%@ OutputCache Duration="15" VaryByParam="*" %> 

o con algún otro valor para el VaryByParam. Ver http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx, http://blog.maartenballiauw.be/post/2008/06/Creating-an-ASPNET-MVC-OutputCache-ActionFilterAttribute.aspx y http://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/18/asp-net-output-cache-provider.aspx.

Además, si tiene la página de inicio que no depende del usuario, es posible reemplazar la página de inicio con una página de bienvenida muy estática con el campo vacío (div oculto) en lugar de "¡Bienvenido, Matt! Fuera". Después de eso, se puede iniciar una solicitud de ajax para el llenado del nombre de usuario en el lado del cliente. Este tipo de página de bienvenida puede ser muy buena en caché.

+0

En el caso de Matt esto significa que una versión separada de la página será puesta en caché para cada valor del parámetro (cada nombre de usuario en su caso). –

+1

Buen punto, aunque recuperar el nombre de usuario a través de ajax es una idea interesante. También podría intentar recuperar el nombre de usuario de una cookie, para evitar hacer una solicitud adicional al servidor. –

+1

Pensé que uno debe evitar la directiva de página 'OutputCache' en la aplicación MVC y usar filtros de acción en su lugar. : S –

0

Aquí tienes una solución solución:

* Añadir el atributo OuptutCache al controlador que gestiona toda la vista como por lo general:

[OutputCache(Duration = 3600, VaryByParam = "*")] 
public ActionResult Index(FormCollection formCollection) 
{ 
    //Controller code 
} 

* Para la parte que no quiere hacer almacenamiento en caché, cargarlo usando jquery + una petición AJAX (con su propio controlador y sin el atributo OutputCache):

<div id="loginContainer"></div> 

$(document).ready(function() { 

    $.post('controller/action', postdata, function(data) { 

    if (data.success == true) { 

     //Populate the container with the obtained data 
    } 
    }); 

}); 

la vista se recupera de la salida de la caché y, una vez que se carga, se realizará una solicitud para obtener la información de inicio de sesión. Afortunadamente, será una solicitud muy rápida y el usuario no notará la demora.

+0

¿Y qué sucede cuando JavaScript está deshabilitado en el cliente? –

+0

@rock no funcionará. – Rangoric

0

Obtener esta vía Nuget: http://mvcdonutcaching.codeplex.com/

añadir una acción de LogOnPArtial, para que pueda cambiarlo de Html.Partial a Html.Action en el _Layout.cshtml

@Html.Action("_LogOnPartial","Account",true) 

El true es una excluye el parámetro que dice, excluye esto del almacenamiento en caché. Se llamará a la acción incluso si la página en la que se encuentra está en caché. Este es el "agujero" en la rosquilla que no está en la caché.

En su página, como About.cshtml que desea almacenar en caché, aplique el atributo DonutOutputCache. Esto permite que el nuevo marco inspeccione la página mientras la almacena en la memoria caché y agrega indicadores donde ha excluido las acciones.

Lo bueno es que _LogOnPartial no se almacena en la memoria caché y se actualizará para diferentes usuarios mientras que el resto de la página se almacenará en caché y no se ejecutará la acción Acerca de(). Incluso podría configurar el almacenamiento en caché en la acción _LogOnPartial que creó utilizando el atributo DonutOutputCache, pero un intervalo más frecuente o menos frecuente, o variar según algún otro parámetro. Esto le permite componer páginas de parciales, y la lógica de actualización de caché se configura independientemente para cada parcial.

IMO esta herramienta es exactamente como imaginé que el almacenamiento en caché en MVC debería haberse implementado.

Cuestiones relacionadas