2011-02-28 12 views
19

Estoy intentando utilizar la nueva caché de página parcial disponibles en ASP.NET MVC 3. En mi opinión, estoy usando:almacenamiento en caché de página parcial y VaryByParam en ASP.NET MVC 3

<% Html.RenderAction("RenderContent", Model); %> 

Qué llama al método del controlador:

[Authorize] 
[OutputCache(Duration = 6000, VaryByParam = "*", VaryByCustom = "browser")] 
public ActionResult RenderContent(Content content) 
{ 
    return PartialView(content); 
} 

Tenga en cuenta que tanto la vista original como la vista parcial están utilizando el mismo modelo de vista.

El problema es que VaryByParam no funciona - RenderContent() siempre devuelve el mismo HTML en caché independientemente del modelo de vista que se le pase. ¿Hay algo sobre VaryByParam que no entiendo?

+0

Cómo está decorado el método de acción llamado, caché inteligente? Además, VaryByParam no tiene nada que ver con el modelo pasado al método de acción; tiene que ver con los parámetros (cadena de consulta, formulario, etc.) enviados por el navegador - * al método de acción de llamada *, en este caso. – bzlm

+0

No se especifica el almacenamiento en caché en el método de acción de llamada. –

+0

@bzlm, el almacenamiento parcial de la página parcial * does * tiene que ver con los parámetros de entrada, y no con los campos querystring/form. Consulte http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx, sección Mejoras del almacenamiento en caché de salida. – Carvellis

Respuesta

26

Creo que lo descubrí. Parece que el problema es que VaryByParam, cuando el parámetro de entrada es un objeto, usa ToString() en ese objeto para determinar su singularidad. Así que esto deja dos opciones:

  1. Reemplazando ToString() para proporcionar un identificador único.
  2. Pasar un identificador único como un parámetro adicional:

    <% Html.RenderAction("RenderContent", Model, Model.Id); %> 
    
    [Authorize] 
    [OutputCache(Duration = 6000, VaryByParam = "id", VaryByCustom = "browser")] 
    public ActionResult RenderContent(Content content, string id) 
    { 
        return PartialView(content); 
    } 
    
+1

Gran respuesta, justo lo que necesitábamos. Usamos la opción 1. Usando 'return GetHashCode(). ToString();' en la 'cadena de sobrescritura pública ToString()' para crear un código único para cada objeto. Esto parece funcionar bien. –

+0

No use '' 'GetHashCode(). ToString()' '' como ID único. Los códigos hash no están diseñados para ser únicos, solo únicos. – erikkallen

Cuestiones relacionadas