Удаление блока из ContentArea
Я хочу удалить блок с неработающими ссылками со своей страницы. Например, мы используем EPi Server Commerce, и иногда продукт удаляется из PIM в торговле, и мне нужно удалить все блоки, на которые ссылался этот продукт.
Но что-то "шаткое"...
Некоторые блоки иногда все еще существуют после того, как я попытался их удалить. Если я добавлю новый блок в ContentArea, он, кажется, удалит старые значения, и ContentArea снова в порядке. Как будто сервер EPi не видит мои изменения как изменения и ничего не публикует.
private void CleanNonExistingBlocks(PageData page)
{
page = page.CreateWritableClone();
var type = page.GetType();
var props = type.GetProperties();
bool isPageDirty = false;
foreach (var propertyInfo in props)
{
if (propertyInfo.PropertyType != typeof(ContentArea))
continue;
ContentArea value = propertyInfo.GetValue(page, null) as ContentArea;
if (value == null)
continue;
List<ContentAreaItem> list = value.Items.ToList();
bool isListDirty = false;
foreach (var contentAreaItem in list.ToList())
{
IContent found;
if (_contentRepository.TryGet<IContent>(contentAreaItem.ContentLink, out found))
continue;
isPageDirty = true;
isListDirty = true;
list.RemoveAll(c => c.Equals(contentAreaItem));
}
if (isListDirty)
{
value.Items.Clear();
foreach (ContentAreaItem contentAreaItem in list)
value.Items.Add(contentAreaItem);
propertyInfo.SetValue(page, value);
}
}
if (isPageDirty)
{
_contentRepository.Save(page, SaveAction.Publish, AccessLevel.NoAccess);
_outputMessages.Add(page.Name + " - ");
}
}
1 ответ
Решение
Проблема в том, что вы используете.NET Reflection API, а не EPiServers API. Посмотрите ответ на этот вопрос для примера того, как работать с ContentArea в коде: