Episerver: получить свойства ссылки для создания абсолютного URL

#url #episerver

#url #episerver

Вопрос:

У меня есть существующий тип блока, который имеет свойство type PageReference , которое указывает на внутренние страницы.

Требуется заменить существующее свойство Url свойством, которое может указывать на внутреннее или внешнее содержимое.

Для этого я создал задание расписания для переноса значения свойства для существующих блоков в производственной среде.

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

 //implementation
var contentTypeRepository = ServiceLocator.Current.GetInstance<EPiServer.DataAbstraction.IContentTypeRepository>();
var contentModelUsage = ServiceLocator.Current.GetInstance<IContentModelUsage>();
var repository = ServiceLocator.Current.GetInstance<IContentRepository>();

//Teaser Item Block
var blockItem = contentTypeRepository.Load(typeof(TeaserItemBlock));

// get usages, also includes versions
IList<ContentUsage> usages = contentModelUsage.ListContentOfContentType(blockItem);
  

Теперь я хочу перебрать экземпляры блоков и установить Url свойство.

Комментарии:

1. Удалось ли преобразовать значение свойства?

2. Привет, Тед, да, я смог получить свойство, но мне пришлось немного изменить подход, поскольку мы не можем получить свойство напрямую. Ваш ввод помог мне получить желаемый результат. Ниже приведена реализация кода, которую я вставил. Мы приветствуем ваши отзывы. Еще раз спасибо

Ответ №1:

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

Что-то вроде следующего:

 YourContent.NewUrlProperty = 
    ServiceLocator.Current.GetInstance<IPermanentLinkMapper>()               
    .Find(YourContent.OldPageReferenceProperty)
    .PermanentLinkUrl
  

Комментарии:

1. Да, это была опечатка. Я пересмотрел вопрос и изменил его.

2. Ок, понял, добавлен пример кода для преобразования значения свойства. Скрестив пальцы. 🙂

Ответ №2:

         //implementation
        var contentTypeRepository = ServiceLocator.Current.GetInstance<EPiServer.DataAbstraction.IContentTypeRepository>();
        var contentModelUsage = ServiceLocator.Current.GetInstance<IContentModelUsage>();
        var repository = ServiceLocator.Current.GetInstance<IContentRepository>();

        //Teaser Item Block
        var blockItem = contentTypeRepository.Load(typeof(TeaserItemBlock));

        // get usages, also includes versions
        IList<ContentUsage> usages = contentModelUsage.ListContentOfContentType(blockItem);


        foreach (var block in usages.Select(contentUsage => contentUsage.ContentLink.ToReferenceWithoutVersion()).Distinct().Select(contentReference => repository.Get<TeaserItemBlock>  (contentReference)))
        {

            if (!string.IsNullOrEmpty(block.GetPropertyValue("Link")))//This is the Page reference property name
            {
                    var writableCloneBlockItem = (TeaserItemBlock)block.CreateWritableClone();

                    // Creating a page reference by the page id
                    PageReference pageReference = new PageReference(block.Link);
                    
                    // Creating instance for "ContentLoader" class by ServiceLocator - dependency injection
                    IContentLoader contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();

                    // Getting the actual requested page
                    PageData requstedPage = contentLoader.Get<PageData>(pageReference);
                                        
                    writableCloneBlockItem.Url = requstedPage.LinkURL;
                    writableCloneBlockItem.Property["Link"].Value = null;
                    repository.Save((IContent)writableCloneBlockItem, EPiServer.DataAccess.SaveAction.Publish, EPiServer.Security.AccessLevel.Read);
            }
        }