#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);
}
}