Невозможно изменить макет MVC в SiteCore 8.0 (обновление 3) из кода

Я пытаюсь изменить макет в SiteCore 8.0 (обновление 3) для всех моих страниц из кода позади. Я использую конвейер решателя разметки для него. я могу отладить и увидеть измененный путь, но не могу получить обновленный макет на пользовательском интерфейсе. Я видел различные посты от Google, которые делают то же самое, но они довольно старые (старше 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"/>

Снимок экрана отладки

1 ответ

Решение

Поскольку вы используете MVC, вам нужно добавить процессоры в другой набор конвейеров, LayoutResolver упомянутый вами конвейер относится только к проектам Webforms.

Я бы предложил вам создать еще один Layout пункт под /sitecore/layout/Layouts для вашего вторичного макета MVC. Затем создайте процессор, который при необходимости переключит элемент макета на дополнительный:

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 к нулю, так как это заставит рендеринг быть заново и использовать альтернативный макет из идентификатора, который вы только что установили.

Другие вопросы по тегам