9

Jak mogę buforować całą stronę z wyjątkiem nieco u góry, która mówi coś podobnego do linii "Welcome back, Matt! | Log Out", jeśli użytkownik jest zalogowany i tak dalej?Pamięć podręczna wyjściowa ASP.NET MVC z dynamicznym fragmentem

Używam ASP.NET MVC 2.

+0

To jest czasami nazywane "buforowaniem pączków" i nie jest obsługiwane w asp.net mvc 2 http://stackoverflow.com/questions/2806663/donut-caching-asp-net-mvc2 –

+0

Dlaczego? o_O Czy nie istnieją inne możliwe rozwiązania? –

+1

Nie widziałem implementacji buforowania pączków. Zawsze można buforować dane w kontrolerze, zamiast buforować dane wyjściowe html. –

Odpowiedz

6

To, co próbujesz osiągnąć, to tak zwane buforowanie pączków lub zastępowanie pamięci podręcznej. Od wersji ASP.NET MVC 2 nie ma wbudowanego pomocnika obsługującego ten scenariusz. O ile wiem, była to planowana funkcja w MVC v.1, ale została upuszczona gdzieś w drodze do wydania. Aby uzyskać więcej informacji, sprawdź ten link http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx, Is Donut Caching working properly with ASP.NET MVC?. Opcja VaryByParam, o której wspomina Oleg, nie jest dobrym pomysłem w twoim przypadku. Jeśli masz VaryByParam, inna wersja strony zostanie umieszczona w pamięci podręcznej dla każdej innej wartości parametru (w twoim przypadku dla każdej nazwy użytkownika). Osobiście uważam, że buforowanie danych, a nie cały wynik strony.

3

Prawdopodobnie pomaga

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

lub z inną wartością dla VaryByParam. Zobacz http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx, http://blog.maartenballiauw.be/post/2008/06/Creating-an-ASPNET-MVC-OutputCache-ActionFilterAttribute.aspx i http://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/18/asp-net-output-cache-provider.aspx. Ponadto, jeśli masz stronę początkową, która nie jest zależna od użytkownika, istnieje możliwość zastąpienia strony początkowej bardzo statyczną stroną powitalną z pustym polem (ukryty element div) zamiast "Witamy ponownie, Matt! Na zewnątrz". Następnie zapytanie ajax o wypełnienie nazwy użytkownika może zostać uruchomione po stronie klienta. Ten rodzaj strony powitalnej może być bardzo dobrze buforowany.

+0

W przypadku Matta oznacza to, że oddzielna wersja strony zostanie umieszczona w pamięci podręcznej dla każdej wartości parametru (każda nazwa użytkownika w jego przypadku). –

+1

Dobrze, chociaż wyszukiwanie nazwy użytkownika przez ajax jest interesującym pomysłem. Mogę również spróbować pobrać nazwę użytkownika z pliku cookie, aby zapobiec wysyłaniu dodatkowego żądania do serwera. –

+1

Myślałem, że należy unikać dyrektywy "OutputCache" strony w aplikacji MVC i zamiast tego używać filtrów akcji. : S –

0

Tutaj masz rozwiązanie Obejście:

* dodać atrybut OuptutCache do kontrolera, który zarządza całą widok jak zwykle:

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

* Dla części, które nie chcą robić buforowanie, należy załadować go za pomocą jQuery + ajax żądanie (z własnym kontrolerem i bez atrybutu 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 
    } 
    }); 

}); 

widok będą pobierane z bufora wyjściowego i, po załadowaniu zostanie wykonane żądanie uzyskania danych logowania. Mamy nadzieję, że będzie to bardzo szybki wniosek, a użytkownik nie zauważy opóźnienia.

+0

Co się dzieje, gdy JavaScript jest wyłączony na kliencie? –

+0

@rock nie będzie działać. – Rangoric

0

Get to poprzez Nuget: http://mvcdonutcaching.codeplex.com/

Dodaj skargę o LogOnPArtial, więc można go zmienić z Html.Partial do Html.Action w _Layout.cshtml

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

true jest wykluczyć parametr, który mówi, wykluczyć to z pamięci podręcznej. Akcja zostanie wywołana, nawet jeśli strona, na której się znajduje, jest zapisana w pamięci podręcznej. To jest "dziura" w pączku, który nie jest buforowany.

Na Twojej stronie, takiej jak About.cshtml, która ma być buforowana, zastosuj atrybut DonutOutputCache. Dzięki temu nowa struktura może przeglądać stronę podczas jej buforowania i dodawać flagi, w których wykluczono działania.

Dobrą rzeczą jest _LogOnPartial nie jest buforowany i odświeży się dla różnych użytkowników, podczas gdy reszta strony zostanie zapisana w pamięci podręcznej, a akcja About() nie zostanie uruchomiona. Można nawet skonfigurować buforowanie w akcji _LogOnPartial utworzonej za pomocą atrybutu DonutOutputCache, ale częściej lub rzadziej, lub w inny sposób. Umożliwia to komponowanie stron częściowych, a logika odświeżania pamięci podręcznej jest niezależnie konfigurowana dla każdego elementu częściowego.

IMO to narzędzie jest dokładnie tym, jak sobie wyobrażałem, że buforowanie w MVC powinno zostać zaimplementowane.

Powiązane problemy