Glass Mapper не отображает некоторые свойства элемента

(Я использую Sitecore 8.1 Update 3 со Glass Mapper.Sc версии 4.1.1.66)

Я столкнулся с проблемой, когда некоторые свойства элемента Sitecore не заполняются в коде через Glass Mapper. Значения в нашем элементе Content Base (Id, Name, Display Name, типичные поля Sitecore), похоже, заполняются правильно, но поля дочернего элемента (я назову его Overview) вообще не отображаются. Все они являются строками, но все они заканчиваются нулевыми, хотя значения Content Base выглядят правильными. У нас также есть карты дочерних классов, которые работают в других областях, поэтому это может быть не причиной.

Ранее в этом проекте у нас была проблема со Glass Mapper, когда имена полей с пробелами не читались. Тем не менее, я позаботился о том, чтобы пропустить все пробелы в именах полей, но это не решает проблему.

Другой возможный вклад в проблему заключается в том, что у нас на сайте несколько языков, поэтому вполне возможно, что откат языка может усложнить ситуацию. Тем не менее, у нас включен резервный режим, и он работает без проблем на всем сайте.

При необходимости я могу опубликовать код, но по большей части это просто классы POCO и отображения.

Любые идеи о том, какие другие части я должен изучить?

2 ответа

Вам нужно использовать VersionCountDisabler()Вы можете найти более подробную информацию об этом в этом предыдущем вопросе и в этом блоге.

Использование выключателя не требуется в Sitecore 8.1 и при использовании языкового отступления, но я могу подтвердить, что это проблема, и с помощью VersionCountDisabler() решил проблему для нас.

Internally Glass проверит, существует ли версия предмета, если нет, вернет ноль. Похоже, что Sitecore вернет количество версий для элементов с макетом, но не для элементов источника данных.

Мы подключили блокировщик немного по-другому, чем использование файла global.asax, вместо этого добавив патчи в конвейеры http-запросов:

using Glass.Mapper.Sc;
using Sitecore.Pipelines.HttpRequest;

namespace MyProject.Custom.Pipelines.HttpRequest
{
    public class ItemVersionCountDisablerBegin : HttpRequestProcessor
    {
        public override void Process(HttpRequestArgs args)
        {
            Sitecore.Context.Items["Glass::VersionCountDisabler"] = new VersionCountDisabler();
        }
    }

    public class ItemVersionCountDisablerEnd : HttpRequestProcessor
    {
        public override void Process(HttpRequestArgs args)
        {
            VersionCountDisabler disabler = Sitecore.Context.Items["Glass::VersionCountDisabler"] as VersionCountDisabler;
            Sitecore.Context.Items["Glass::VersionCountDisabler"] = null;
            disabler?.Dispose();
        }
    }
}

А затем добавьте это в начало и конец http-запроса:

<pipelines>
  <httpRequestBegin>
    <processor type="MyProject.Custom.Pipelines.HttpRequest.ItemVersionCountDisablerBegin, MyProject.Custom" patch:before="*[1]"/>
  </httpRequestBegin>
  <httpRequestEnd>
    <processor type="MyProject.Custom.Pipelines.HttpRequest.ItemVersionCountDisablerEnd, MyProject.Custom" />
  </httpRequestEnd>      
</pipelines>

После некоторых экспериментов я нашел причину проблемы.

В моем классе отображения вы увидите следующую строку:

config.Field(f => f.HeaderPrefix).FieldName("AssetOverviewContentHeaderPrefix");

Название поля кажется довольно длинным, верно? Мы добавляли имя категории к имени поля, чтобы избежать повторяющихся имен в элементах, так как мы делаем значительное количество наследования.

Вот в чем проблема. Когда я удалил "AssetOverviewContent" из имен полей, все работало нормально. Основываясь на этом, я провел еще несколько экспериментов.

Я обнаружил, что имена полей длиной до 23 символов работали просто отлично. 24 или больше, и они не будут отображаться. Я понятия не имею, почему это число, в частности, является пределом, но я предполагаю, что где-то происходит другое сопоставление, которое выходит за пределы.

Немного больше экспериментов также показало, что отображение с использованием FieldId также не работает. Длина направляющих будет более 23 символов, так что в этом есть смысл. Тем не менее, вы не можете сделать руководство менее чем из 23 символов, поэтому я не могу подтвердить.

Я могу в конечном итоге посмотреть код Glass Mapper в ближайшее время, чтобы увидеть, смогу ли я найти ответ. Но теперь, когда я знаю, что есть проблема, я могу ее избежать.

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