Как я мог кэшировать всю страницу кроме немного наверху, вроде которой говорит что-то "Welcome back, Matt! | Log Out"
если пользователь зарегистрирован и так далее?
Я использую ASP.NET MVC 2.
То, что вы пытаетесь достичь, называется кэшированием пончика или подстановкой кеша. В ASP.NET MVC 2 нет встроенного помощника для поддержки этого сценария. Насколько я знаю, это была запланированная функция в MVC v.1, но она была упразднена где-то на пути к выпуску. Для получения дополнительной информации проверьте эти ссылки http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx , Правильно ли работает кеширование пончиков? с ASP.NET MVC? . Опция VaryByParam, о которой упоминал здесь Олег, в вашем случае не лучшая идея. Если у вас есть VaryByParam, другая версия страницы будет помещена в кеш для каждого другого значения параметра (в вашем случае для каждого имени пользователя). Лично я бы подумал о кешировании данных, а не всего вывода страницы.
Не поддерживается! = Невозможно
http://www.klopfenstein.net/lorenz.aspx/output-donut-caching-attribute -asp-net-mvc-partial-requests
http://haacked.com/archive/2009/05/12/donut-hole-caching.aspx
Возможно, поможет
<%@ 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-запрос для заполнения имени пользователя. Такая страница приветствия может очень хорошо кэшироваться.
Здесь у вас есть временное решение:
* Добавьте атрибут 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
}
});
});
Представление будет получено из кэша вывода, и после его загрузки будет выполнен запрос на получение информации для входа в систему. Надеюсь, это будет очень быстрый запрос, и пользователь не заметит задержки.