无法从代码更改 SiteCore 8.0(更新 3)中的 mvc 布局

Cannot change mvc layout in SiteCore 8.0 (update 3) from code

我正在尝试通过代码隐藏更改我所有页面在 SiteCore 8.0(更新 3)中的布局。 我正在为此使用布局解析器管道。 我可以调试并查看更改后的路径,但无法在 UI 上获得更新的布局。我通过谷歌搜索看到了各种各样的 post,他们在做同样的事情,但他们已经很老了(比 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 在配置中显示我的解析器注册。 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"/>

由于您使用的是 MVC,因此您需要将处理器添加到一组不同的管道中,您提到的 LayoutResolver 管道仅与 Webforms 项目相关。

我建议您在 /sitecore/layout/Layouts 下为您的辅助 MVC 布局创建另一个 Layout 项。然后创建处理器,根据需要将布局项切换到辅助布局项:

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 中的替代布局。