2010-11-04 20 views
9

Actualmente estoy desarrollando un sitio web usando asp.net mvc 2 en C#. Nunca utilicé la función de almacenamiento en caché en MVC y me gustaría aplicarla a la página de perfil de usuario. El contenido de esta página rara vez cambia y la única parte que debe estar en tiempo real es la lista de publicaciones recientes del usuario. (Uso linq-to-sql para cargar datos de la base de datos)Asp.net MVC 2 almacenamiento en caché

Necesito algunas sugerencias sobre la técnica de almacenamiento en caché que debo usar y cómo implementarla?

Actualización: La solución de Xandy a continuación casi funciona, excepto que no puedo pasar los datos. ¿Cómo reescribiría esto usando el? Html.RenderPartial ("UserPosts", ViewData ["UserPosts"])

+0

Véase también http://stackoverflow.com/questions/4082826/when-and-how-to-go-about-performing-caching-in-asp-net-mvc/4091232#4091232 –

+0

¿Alguien sabe la respuesta? a mi actualización? – Rana

+0

necesita usar la cuarta sobrecarga para RenderPartial (http://msdn.microsoft.com/en-us/library/dd470561.aspx) intente: 'Html.RenderPartial (" UserPosts.ascx ", Model.UserPosts, new ViewDataDictionary {Modelo = Model.UserPosts} '. – RPM1984

Respuesta

1

ASP.Net tiene un tutorial on output caching for MVC.

Partial (aka Donut) Caching que funcionaría para MVC2.

+0

Sí, también lo vi. Pero, ¿cómo puedo almacenar en caché la página sin hacer una parte de ella en la memoria caché? – Rana

+0

la siguiente página de eso habla sobre el almacenamiento en caché parcial. http://www.asp.net/mvc/tutorials/adding-dynamic-content-to-a-cached-page-cs – xandy

+0

¿Sigue siendo este el método preferido en MVC 2? – Rana

5

Como otras respuestas han declarado, buñuelo almacenamiento en caché "una especie de" obras en MVC.

No recomendaría que - en su lugar voy a ofrecer una alterantive:

se tiene una vista de los usuarios de perfil, vamos a llamarlo "UserProfile.aspx".

Ahora, en esta vista, tiene un montón de HTML, incluida una sección para "publicaciones recientes".

Ahora, supongo que esto es algo así como las últimas 10 publicaciones para el usuario.

Lo que me gustaría hacer es poner este código HTML/sección en una vista parcial, y servirlo a través de un método de acción independiente, también conocido como un PartialViewResult:

public class UserProfileController 
{ 
    [HttpGet] 
    [OutputCache (Duration=60)] 
    public ActionResult Index() // core user details 
    { 
     var userProfileModel = somewhere.GetSomething(); 
     return View(userProfileModel); 
    } 

    [HttpGet] 
    public PartialViewResult DisplayRecentPosts(User user) 
    { 
     var recentPosts = somewhere.GetRecentPosts(user); 
     return PartialViewResult(recentPosts); 
    } 
} 

renderizar la vista parcial usando jQuery:

<script type="text/javascript"> 
    $(function() { 
    $.get(
     "/User/DisplayRecentPosts", 
     user, // get from the Model binding 
     function (data) { $("#target").html(data) } // target div for partial 
    ); 
    }); 
</script> 

De esta manera, puede maximizar el OutputCache para los detalles del núcleo (Índice()), pero las publicaciones recientes no se almacenan en caché. (o puede tener un período de caché muy pequeño).

El método jQuery para representar el parcial es diferente a RenderPartial, de esta forma está sirviendo el código HTML directamente desde el controlador, por lo que puede controlar el almacenamiento en caché de salida en consecuencia.

El resultado final es muy similar al caché de donuts (partes de la página en caché, otras no).

+1

¿Y qué hay de los clientes sin javascript? – xandy

+2

¿Era ese un requisito que el OP establecía? – RPM1984

Cuestiones relacionadas