2011-02-28 11 views
19

Ja próbuje użyć nowego częściowe buforowanie stron dostępnych w ASP.NET MVC 3. Moim zdaniem, używam:Częściowe buforowanie Page i VaryByParam w ASP.NET MVC 3

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

Która wywołuje metodę kontrolera:

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

Należy zauważyć, że zarówno pierwotny widok, jak i częściowy widok są w tym samym modelu widoku.

Problem polega na tym, że VaryByParam nie działa - RenderContent() zawsze zwraca ten sam buforowany HTML bez względu na to, jaki model widoku jest do niego przekazywany. Czy jest coś o VaryByParam, którego nie rozumiem?

+0

Jak jest metoda działania wywołującego urządzone, cache-mądry? Ponadto VaryByParam nie ma nic wspólnego z Modelem przekazanym do metody akcji - ma to związek z parametrami (ciąg zapytania, formularz itp.) Wysyłanymi przez przeglądarkę - * do metody akcji wywołującej *, w tym przypadku. – bzlm

+0

Nie określono buforowania w metodzie wywoływania akcji. –

+0

@bzlm, częściowe buforowanie stron * ma * dotyczy parametrów wejściowych, a nie pól zapytania/formularza. Zobacz http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx, sekcja Udoskonalenia buforowania wyników. – Carvellis

Odpowiedz

26

Myślę, że to wymyśliłem. Wygląda na to, że problem polega na tym, że VaryByParam, gdy parametr wejściowy jest obiektem, używa ToString() na tym obiekcie, aby określić jego wyjątkowość. Pozostawia to dwie opcje:

  1. Przesłanianie ToString() w celu podania unikalnego identyfikatora.
  2. Przechodząc unikalny identyfikator jako dodatkowy parametr:

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

Świetna odpowiedź, właśnie to, czego potrzebowaliśmy. Użyliśmy opcji 1. Używając 'return GetHashCode(). ToString();' w 'publicznym override łańcuchu ToString()', aby utworzyć unikalny kod dla każdego obiektu. Wydaje się, że działa dobrze. –

+0

Nie używaj '' 'GetHashCode(). ToString()' '' jako unikalnego identyfikatora. Hasła hasłowe _nie_ mają być unikatowe, tylko unikalne-ish. – erikkallen

Powiązane problemy