我正在尝试从代码隐藏的所有页面中更改SiteCore 8.0(更新3)中的布局。 我正在使用布局解析器管道。 我可以调试&看到更改的路径,但无法在UI上获得更新的布局。我通过谷歌搜索看到了各种各样的帖子,他们做同样的事情,但那些已经很老了(年龄大于2-3岁)。
下面是我的布局解析器管道代码
public class LayoutResolver : HttpRequestProcessor
{
public LayoutResolver()
{
System.Diagnostics.Trace.WriteLine("PipeLine: ctor() has been called");
}
/// <summary>
/// Gets the layout for the page
/// </summary>
/// <param name="args"></param>
public override void Process(HttpRequestArgs args)
{
System.Diagnostics.Trace.WriteLine("PipeLine: This is atleast called");
Assert.ArgumentNotNull(args, "args");
if (!CanProcess())
{
return;
}
Context.Page.FilePath = "/Views/Shared/BusinessLayout_Two.cshtml";
}
private static bool CanProcess()
{
return Context.Database != null
&& !IsCore(Context.Database);
}
private static bool IsCore(Database database)
{
return database.Name == Constants.CoreDatabaseName;
}
}
编辑:showconfig.config在config中显示我的解析器寄存器。 SiteCoreSample.Helpers.LayoutResolver是我的解析器。
<processor type="Sitecore.Pipelines.HttpRequest.LayoutResolver, Sitecore.Kernel"/>
<processor type="SiteCoreSample.Helpers.LayoutResolver, SiteCoreSample" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.HttpRequest.TransferMvcLayout, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.Mvc.Pipelines.HttpRequest.TransferControllerRequest, Sitecore.Mvc" patch:source="Sitecore.Mvc.config"/>
<processor type="Sitecore.ExperienceEditor.Pipelines.HttpRequest.CheckDevice, Sitecore.ExperienceEditor" patch:source="Sitecore.ExperienceEditor.config"/>
<processor type="Sitecore.Pipelines.HttpRequest.PageEditorHandleNoLayout, Sitecore.ExperienceEditor" patch:source="Sitecore.ExperienceEditor.config"/>
<processor type="Sitecore.ExperienceExplorer.Business.Pipelines.HttpRequest.ExecuteRequest, Sitecore.ExperienceExplorer.Business" patch:source="Sitecore.ExperienceExplorer.config"/>
答案 0 :(得分:5)
由于您使用的是MVC,因此需要将处理器添加到另一组管道中,您提到的LayoutResolver
管道仅与Webforms项目相关。
我建议您在Layout
下为您的辅助MVC布局创建另一个/sitecore/layout/Layouts
项。然后创建处理器,根据需要将布局项切换到辅助项:
using System;
using Sitecore;
using Sitecore.Mvc.Pipelines.Response.GetPageRendering;
namespace MyProject.CMS.Custom.Pipelines.GetPageRendering
{
public class GetCustomLayoutRendering : GetPageRenderingProcessor
{
public override void Process(GetPageRenderingArgs args)
{
if (args.Result == null)
return;
if (!ShouldSwitchLayout()) //or whatever your custom logic is
return;
args.Result.LayoutId = new Guid("{guid-to-alt-layout}");
args.Result.Renderer = null;
}
}
}
并将处理器修补到mvc.getPageRendering
管道:
<mvc.getPageRendering>
<processor type="MyProject.CMS.Custom.Pipelines.GetPageRendering.GetCustomLayoutRendering, MyProject.CMS.Custom"/>
</mvc.getPageRendering>
将args.Result.Renderer
设置为null非常重要,因为这会强制重新渲染渲染并使用您刚设置的ID中的替代布局。