ASP.NET MVC выходной кеш с динамическим фрагментом - PullRequest
9 голосов
/ 27 июля 2010

Как я могу кешировать целую страницу, кроме бит вверху, который говорит что-то вроде "Welcome back, Matt! | Log Out", если пользователь вошел в систему и так далее?

Я использую ASP.NETMVC 2.

Ответы [ 5 ]

6 голосов
/ 30 июля 2010

То, что вы пытаетесь достичь, называется кешированием пончиков или заменой кеша.Начиная с ASP.NET MVC 2 нет встроенного помощника для поддержки этого сценария.Насколько я знаю, это была запланированная функция в MVC v.1, но она была пропущена где-то на пути к релизу.Для получения дополнительной информации проверьте эти ссылки http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx, Правильно ли работает Donut Cache с ASP.NET MVC? .Вариант VaryByParam, который упоминает Олег здесь, не очень хорошая идея в вашем случае.Если у вас есть VaryByParam, другая версия страницы будет помещена в кэш для каждого отдельного значения параметра (в вашем случае для каждого имени пользователя).Лично я бы подумал о кэшировании данных, а не всего вывода страницы.

3 голосов
/ 29 июля 2010

Вероятно, помогает

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

или с некоторым другим значением для VaryByParam.См. http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx, http://blog.maartenballiauw.be/post/2008/06/Creating-an-ASPNET-MVC-OutputCache-ActionFilterAttribute.aspx и http://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/18/asp-net-output-cache-provider.aspx.

Более того, если у вас есть стартовая страница, которая не зависит от пользователя, можно заменить стартовую страницу очень статичным приветствиемстраница с пустым полем (скрытый div) вместо «Welcome back, Matt! | Log Out».После этого ajax-запрос на заполнение имени пользователя может быть запущен на стороне клиента.Этот вид страницы приветствия может быть очень хорошо кэширован.

0 голосов
/ 24 августа 2012

Получите это через nuget: http://mvcdonutcaching.codeplex.com/

Добавьте действие для LogOnPArtial, чтобы вы могли изменить его с Html.Partial на Html.Action в _Layout.cshtml

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

true - это параметр исключения, который говорит об исключении этого из кэширования.Действие будет вызвано, даже если страница, на которой оно находится, кэшируется.Это «дыра» в пончике, который не кэшируется.

На вашей странице, например, About.cshtml, который вы хотите кэшировать, примените атрибут DonutOutputCache.Это позволяет новой платформе проверять страницу в процессе ее кэширования и добавлять флаги, где вы исключили действия.

Приятно то, что _LogOnPartial не кэшируется и будет обновляться для разных пользователей, в то время как остальныестраница кэшируется, и действие About () не будет запущено.Вы даже можете настроить кэширование для действия _LogOnPartial, созданного вами с помощью атрибута DonutOutputCache, но с более частым или менее частым интервалом, либо изменить его по другому параметру.Это позволяет вам составлять страницы с частями, и логика обновления кэша независимо настраивается для каждой части.

IMO, этот инструмент - именно то, как я предполагал, должно быть реализовано кэширование в MVC.

0 голосов
/ 04 августа 2010

Здесь у вас есть обходное решение:

* Добавьте атрибут OuptutCache в контроллер, который, как обычно, управляет всем представлением:

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

* Для части, которую вы не делаетеЕсли вы хотите выполнить кэширование, загрузите его с помощью jquery + ajax-запроса (с собственным контроллером и без атрибута 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
    }
    });

});

Представление будет получено из выходного кэша и после его загрузкизапрос на получение информации для входа будет выполнен.Надеюсь, это будет очень быстрый запрос, и пользователь не заметит задержку.

...