从 ContentArea 中删除块
Deleting block from a ContentArea
我想从我的页面中删除带有损坏链接的块。
Fx 我们使用 EPi Server Commerce,有时产品从 Commerce 的 PIM 中删除,我需要删除所有引用该产品的块。
但有些事情是 'wonky'...
有些块在我尝试删除它们后有时仍然存在。如果我在 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 + " - ");
}
}
问题是您使用的是 .NET 反射 API:s 而不是 EPiServers API。有关如何在代码中使用 ContentArea 的示例,请参阅此问题已接受的答案:
我想从我的页面中删除带有损坏链接的块。 Fx 我们使用 EPi Server Commerce,有时产品从 Commerce 的 PIM 中删除,我需要删除所有引用该产品的块。
但有些事情是 'wonky'...
有些块在我尝试删除它们后有时仍然存在。如果我在 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 + " - ");
}
}
问题是您使用的是 .NET 反射 API:s 而不是 EPiServers API。有关如何在代码中使用 ContentArea 的示例,请参阅此问题已接受的答案: