Смоделируйте ссылку в umbraco с помощью Glass Mapper

Я использую Glass Mapper для Umbraco. При попытке смоделировать что-то у меня есть класс вроде:

[UmbracoType(AutoMap = true)]
    public class ImageWithLink : BaseUmbracoItem
    {
        public virtual Image Image { get; set; }
        public virtual ?? Link { get; set; }
        public virtual string Copy { get; set; }
    }

Кажется, что нет типа данных «Ссылка», как в реализации Sitecore. Я видел этот пост ( http://bluetubeinc.com/blog/2014/6/glass-mapper-and-umbraco-7), и они используют тип данных «RelatedLink», но такого не существует (я проверил в репозитории Glass).

Должен ли я моделировать его сам?

Изменить: это тип свойства «Связанные ссылки».


person Lee Cook    schedule 13.02.2015    source источник


Ответы (2)


Предполагая, что Umbraco не изменился в течение некоторого времени и что вы имеете в виду ссылку, как в якоре html...

Я могу ошибаться в этом, но, насколько я помню, Umbraco не имеет понятия о ссылке, когда дело доходит до возврата из API. Он возвращается как идентификатор узла (или список), и вы должны использовать метод расширения, чтобы вернуть URL-адрес.

Как и вы, насколько я вижу в кодовой базе Glass, у него нет явной реализации типа «ссылка», как у нас в Sitecore.

Я предполагаю, что вам придется либо свернуть свой собственный класс, используя собственный класс и функцию делегата, либо использовать целочисленное сопоставление и вызвать метод api umbraco.

Я также предполагаю, что RelatedLink в этом примере сопоставляется с другим классом, который будет использовать UmbracoPropertyTypeMapper аналогично тому, что мы делаем в Sitecore между типами, а не «Ссылка», как в якоре.

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

person Nat    schedule 13.02.2015

Я нашел (довольно ужасное) решение. Umbraco возвращает Json, поэтому мне пришлось его десериализовать. Вы можете превратить это в картограф.

[UmbracoType(AutoMap = true)]
    public class BaseUmbracoItem : IUmbracoItem
    {
        public virtual string Links { get; set; }

        public List<UmbracoLink> TypedLink
        {
            get
            {
                return JsonConvert.DeserializeObject<List<UmbracoLink>>(Links);
            }
        }
    }
public class UmbracoLink
    {
        public string link { get; set; }
        public string type { get; set; }
        public string title { get; set; }
        public bool newWindow { get; set; }
        public bool isInternal { get; set; }
    }

Вот версия картографа:

public class UmbracoLinkMapper : AbstractDataMapper
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="UmbracoLinkMapper"/> class.
        /// </summary>
        public UmbracoLinkMapper()
        {
            ReadOnly = true;
        }

        /// <summary>
        /// Maps data from the .Net property value to the CMS value
        /// </summary>
        /// <param name="mappingContext">The mapping context.</param>
        /// <returns>The value to write</returns>
        /// <exception cref="System.NotSupportedException"></exception>
        public override void MapToCms(AbstractDataMappingContext mappingContext)
        {
            throw new NotSupportedException();
        }

        /// <summary>
        /// Maps data from the CMS value to the .Net property value
        /// </summary>
        /// <param name="mappingContext">The mapping context.</param>
        /// <returns>System.Object.</returns>
        public override object MapToProperty(AbstractDataMappingContext mappingContext)
        {
            var scContext = mappingContext as UmbracoDataMappingContext;
            var scConfig = Configuration as UmbracoLinkConfiguration;

            var properties = scContext.Content.Properties.Where(x => x.Alias == Configuration.PropertyInfo.Name.ToLower()).ToList();
            if (properties.Any())
            {
                var property = properties.First().Value as string;
                return JsonConvert.DeserializeObject<List<UmbracoLink>>(property).First();
            }
            return null;
        }

        /// <summary>
        /// Indicates that the data mapper will mapper to and from the property
        /// </summary>
        /// <param name="configuration">The configuration.</param>
        /// <param name="context">The context.</param>
        /// <returns><c>true</c> if this instance can handle the specified configuration; otherwise, <c>false</c>.</returns>
        public override bool CanHandle(AbstractPropertyConfiguration configuration, Context context)
        {
            return configuration is UmbracoLinkConfiguration;
        }
    }

 public class UmbracoLinkConfiguration : AbstractPropertyConfiguration
    {
        public bool IsLazy { get; set; }
        public bool InferType { get; set; }
    }

public class UmbracoLinkAttribute : AbstractPropertyAttribute
    {
        public bool IsLazy { get; set; }
        public bool InferType { get; set; }

        public override AbstractPropertyConfiguration Configure(PropertyInfo propertyInfo)
        {
            var config = new UmbracoLinkConfiguration { IsLazy = IsLazy, InferType = InferType };
            Configure(propertyInfo, config);
            return config;
        }
    }
person Lee Cook    schedule 13.02.2015