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

时间:2017-07-26 09:37:32

标签: c# web-config sitecore sitecore8 sitecore-mvc

我正在尝试从代码隐藏的所有页面中更改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"/>

Debug screen shot

1 个答案:

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