Удаление блока из 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 в коде:

EpiServer - программно добавляет блок в область содержимого

Другие вопросы по тегам