如何在SitecoreMVC中缓存.cshtml布局



可以向布局上的所有Sitecore MVC视图渲染添加输出缓存,但是始终执行布局本身的.cshtml中的代码。有什么方法可以将OutputCache应用于布局剃刀视图吗?如果是可能的,那将是巨大的浪费

您只能在Sitecore MVC中缓存渲染(视图渲染或控制器渲染),添加控件时,可以在渲染定义项的Caching部分或Presentation Details中为其设置缓存选项。

无法缓存布局(位于/sitecore/layout/Layouts下)。布局类似于查看母版页,因此需要对每个请求执行,以便加载必要的控件。

如果页面中有需要缓存的部分(因此不会在每个请求上执行),则动态绑定并设置缓存选项(可以在基本模板的标准值上设置)。您可以一次缓存多个控件,方法是嵌套它们,然后在更高级别的控件上设置缓存,因为整个控件集的HTML都缓存在一个条目中。

或者,如果代码需要出现在每个页面上,并且你觉得它需要缓存,那么你可以静态地从.cshtml绑定渲染,同时设置缓存选项:

@Html.Sitecore().Rendering("{rendering-guid}", new { Cacheable = true })

你可以在这篇文章中找到更多关于指定静态绑定渲染的数据源项目的信息

根据社区的评论,Sitecore不会添加OutputCache到Razor视图。

但是,您可以基于OutputCache创建一个自定义缓存,并将其自己扩展为可能包含布局Razor视图。

这个博客概述了如何创建一个新的"Vary by…"HTML缓存选项。如果向下滚动到Custom Cache Key Generator(自定义缓存密钥生成器)部分,他将概述覆盖GenerateCacheKeyprocessor的解决方案。

他的文章涉及从外部源缓存数据,但将为您提供正确的指导。

http://www.lightmaker.com/news/sitecore/sitecore-mvc-custom-caching-vary-by-external-data/

Sitecore在MVC.renderRendering管道中定义的处理器的帮助下,在MVC Rendering上应用缓存。

SetCacheability处理器基于渲染的缓存渲染参数和站点上下文来检测是否应该启用缓存。

CCD_ 7处理器基于渲染的缓存渲染参数生成缓存密钥。

如果RenderFromCache处理器为给定的高速缓存关键字找到一个高速缓存输出,则它将以高速缓存输出进行响应。

最后,还有AddRecordedHtmlToCache,它在渲染可缓存的渲染时缓存输出。

如何启用页面级缓存(在Sitecore 8.2 Update 4上测试)

假设表示页面的Sitecore项继承自名为Basepage的模板

将位于/sitecore/templates/System/Layout/Sections/Caching缓存模板{E8D2DD19-1347-4562-AE3F-310DC0B21A6C}添加到基本页的基本模板中。

基本页面继承的每个Sitecore页面项现在都可以访问与渲染相同的缓存字段。

这个想法是在SetCacheability之前添加一个新的处理器。此处理器检测layout渲染类型。如果关联的Sitecore项启用了缓存,它将把缓存定义复制到此呈现中。

该处理器的代码(它使用Glass Mapper,但更改起来很简单):

public class SetPageCaching : RenderRenderingProcessor
{
public SetPageCaching() { }
ISitecoreContext GetSitecoreContext() => SitecoreContextFactory.Default?.GetSitecoreContext();
public override void Process(RenderRenderingArgs args)
{
if (IsPageRendering(args.Rendering) && args.Rendering?.Item != null)
{
var caching = GetSitecoreContext()?.Cast<ICaching>(args.Rendering.Item);
// the cast above always returns an item even if the item doesn't inherit the Caching template
// we check Cacheable property to verify if it has been mapped. 
// Value of false for Cacheable property means that 
// the item doesn't inherit the "Caching" template or Cacheable prop value is false
// we only do something for page items that are marked as cacheable
if (caching?.Cacheable ?? false)
{
UpdateRenderingCachingDefinition(caching, args.Rendering.Caching);
}
}
}
static bool IsPageRendering(Rendering rendering) => rendering?.RenderingType == RenderingTypes.Layout;
static void UpdateRenderingCachingDefinition(ICaching caching, RenderingCachingDefinition def)
{
if (caching == null || def == null) return;
def.Cacheable = caching.Cacheable;
def.VaryByData = caching.VaryByData;
def.VaryByDevice = caching.VaryByDevice;
def.VaryByLogin = caching.VaryByLogin;
def.VaryByParameters = caching.VaryByParam;
def.VaryByUser = caching.VaryByUser;
}
}
[SitecoreType(AutoMap = true, TemplateId = "{E8D2DD19-1347-4562-AE3F-310DC0B21A6C}")]
public interface ICaching
{
[SitecoreField(FieldId = "{3D08DB46-2267-41B0-BC52-BE69FD618633}")]
bool Cacheable { get; set; }
[SitecoreField(FieldId = "{F3E7E552-D7C8-469B-A150-69E4E14AB35C}")]
bool ClearOnIndexUpdate { get; set; }
[SitecoreField(FieldId = "{8B6D532B-6128-4486-A044-CA06D90948BA}")]
bool VaryByData { get; set; }
[SitecoreField(FieldId = "{C98CF969-BA71-42DA-833D-B3FC1368BA27}")]
bool VaryByDevice { get; set; }
[SitecoreField(FieldId = "{8D9232B0-613F-440B-A2FA-DCDD80FBD33E}")]
bool VaryByLogin { get; set; }
[SitecoreField(FieldId = "{3AD2506A-DC39-4B1E-959F-9D524ADDBF50}")]
bool VaryByParam { get; set; }
[SitecoreField(FieldId = "{0E54A8DC-72AD-4372-A7C7-BB4773FAD44D}")]
bool VaryByUser { get; set; }
}

在mvc管道中添加此处理器的配置(使用您自己的类型更改MyAssembly.SetPageCaching, MyAssembly):

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/">
<sitecore>
<pipelines>
<mvc.renderRendering>
<processor type="MyAssembly.SetPageCaching, MyAssembly" patch:before="processor[@type='Sitecore.Mvc.Pipelines.Response.RenderRendering.SetCacheability, Sitecore.Mvc']" />
</mvc.renderRendering>
</pipelines>
</sitecore>
</configuration>

最新更新