Отключить проверку версии для определенного свойства в картографе стекла Sitecore

Я использую SItecore 7.1 с Glass.Mapper.Sc 3.1.7.26. У меня есть следующая модель, в которой поле Service Id является общим:

[SitecoreType]
public class ServiceMapping
{
    [SitecoreField(FieldName = "Service Id")]
    public virtual string ServiceId { get; set; }
}

И у меня есть следующая модель, которая ссылается на сопоставление службы через поле Droptree (также совместно используемое):

[SitecoreType]
public class OnlineService
{
    [SitecoreInfo(SitecoreInfoType.DisplayName)]
    public virtual string DisplayName { get; set; }

    [SitecoreField(FieldName = "Service")]
    public virtual ServiceMapping ServiceMapping { get; set; }
}

Когда я загружаю экземпляр OnlineService, он должен зависеть от языка, так как DisplayName. Предположим, что у меня есть OnlineService на немецком и английском языках, а мой ServiceMapping только на английском, тогда я получаю null для объекта ServiceMapping при запросе страницы на немецком языке.

Можно ли задать для свойства ServiceMapping.ServiceId настройку, при которой оно не должно проверять существующую языковую версию? Я знаю, что есть VersionCountDisabler(), но я не могу его использовать, потому что мне нужен класс OnlineService для проверки языковой версии.


person Kevin Brechbühl    schedule 03.02.2014    source источник
comment
Вам следует изучить модули Language Fallback, это не проблема Glass.   -  person jammykam    schedule 03.02.2014
comment
@jammykam Если это невозможно сделать с помощью Glass (или не должно быть его частью), почему существует VersionCountDisabler ()? Это точно соответствовало бы моим потребностям, я только ищу способ адаптировать это для 1 поля. Языковой резерв — это отдельная история. Элемент ServiceMapping может быть на английском, немецком или любом другом языке. При резервном варианте Item должен быть на резервном языке. Но мне не нужен запасной вариант для общих полей, просто хотелось бы отключить проверку версии.   -  person Kevin Brechbühl    schedule 04.02.2014
comment
Ok. Взгляните на stackoverflow.com/a/19712345/661447, это может помочь. Я уверен, что Майк скоро будет рядом :)   -  person jammykam    schedule 04.02.2014
comment
@jammykam Мне просто нужны баллы :-)   -  person Michael Edwards    schedule 04.02.2014
comment
@MichaelEdwards Очки приносят призы!   -  person jammykam    schedule 04.02.2014


Ответы (1)


Хм, это сложный вопрос, приведенный ниже код не тестировался (я пишу это, когда думаю о решении), но должен указать вам направление записи.

public class MyCrazyType : SitecoreFieldTypeMapper
{
    public override object GetFieldValue(string fieldValue, Mapper.Sc.Configuration.SitecoreFieldConfiguration config, SitecoreDataMappingContext context)
    {
        using (new VersionCountDisabler())
        {
            return base.GetFieldValue(fieldValue, config, context);
        }
    }

    public override bool CanHandle(Mapper.Configuration.AbstractPropertyConfiguration configuration, Context context)
    {
        //this will mean this handle only works for this type
        return configuration.PropertyInfo.PropertyType == typeof (ServiceMapping);
    }

}

Использование этого стекла сопоставит пустой элемент с целевым типом.

Вам нужно будет зарегистрировать обработчик в Glass, см. этот учебник: http://glass.lu/docs/tutorial/sitecore/tutorial19/tutorial19.html

person Michael Edwards    schedule 03.02.2014
comment
Да, это работает идеально. Возможно, я подумаю о создании пользовательского атрибута (унаследованного от SitecoreFieldAttribute) и проверке этого атрибута в обработчике. - person Kevin Brechbühl; 04.02.2014
comment
Это дало бы гораздо более гибкое решение! Опубликовать блог, если вы делаете, я хотел бы видеть его. - person Michael Edwards; 04.02.2014
comment
Я написал сообщение в блоге об этом здесь - person Kevin Brechbühl; 28.03.2014