2011-02-28 20 views
19

sto cercando di utilizzare la nuova pagina di caching parziale disponibili in ASP.NET MVC 3. A mio avviso, sto usando:parziale page caching e VaryByParam in ASP.NET MVC 3

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

Quale chiama il metodo di controllo:

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

noti che sia la vista originale e la vista parziale utilizzano la stessa vista del modello.

Il problema è che VaryByParam non funziona - RenderContent() restituisce sempre lo stesso codice HTML memorizzato nella cache indipendentemente dal modello di visualizzazione che gli viene passato. C'è qualcosa di VaryByParam che non capisco?

+0

Come è il metodo di azione di chiamata decorato, cache-saggio? Inoltre, VaryByParam non ha nulla a che fare con il modello passato al metodo di azione - ha a che fare con i parametri (stringa di query, modulo, ecc.) Inviati dal browser - * al metodo di azione chiamante *, in questo caso. – bzlm

+0

Nessun caching è specificato sul metodo di azione chiamante. –

+0

@bzlm, il caching parziale delle pagine * ha * a che fare con i parametri di input e non con i campi querystring/modulo. Vedi http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx, sezione Output Caching Improvements. – Carvellis

risposta

26

Penso di aver capito. Sembra che il problema è che VaryByParam, quando il parametro di input è un oggetto, usa ToString() su quell'oggetto per determinarne l'unicità. Quindi questo lascia due opzioni:

  1. Ignorare ToString() per fornire un identificativo univoco.
  2. Passando un identificatore univoco come un parametro aggiuntivo:

    <% 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

Ottima risposta, proprio quello di cui avevamo bisogno. Abbiamo usato l'opzione 1. Usando 'return GetHashCode(). ToString();' nella stringa di override pubblica ToString() 'per creare un codice univoco per ogni oggetto. Questo sembra funzionare bene. –

+0

Non utilizzare '' 'GetHashCode(). ToString()' '' come ID univoco. I codici hash sono _not_ progettati per essere unici, solo unique-ish. – erikkallen

Problemi correlati