获取特定页面类型的所有 children
Getting all children of specific page type
我在 EPI CMS 中有以下树:
[Root]
.
.
--[Lobby] ID=1
--Foo1
--Foo2
--Foo3
--[ContainerOfSubFoo] ID=2
--SubFoo1
--SubFoo2
--SubFoo3
我希望在编辑 Foo1 时,有所有 SubFoo 的复选框。
我现在的是这样的:
private static List<SelectItem> GetSubFoos()
{
PageReference pRef = new PageReference(2); //(ID=2 is my container page - ContainerOfSubFoo)
PageData root = DataFactory.Instance.GetPage(pRef);
var pages = DataFactory.Instance.GetChildren<Models.Pages.SubFoo>(root.ContentLink);
List<SelectItem> targetsList = new List<SelectItem>();
foreach (var target in pages)
{
targetsList.Add(new SelectItem() { Value = target.ContentLink.ID.ToString(), Text = target.SubFooProperty });
}
return targetsList;
}
这很好用,但我不想使用 ID=2,我希望 GetSubFoos 转到 "up"(到大厅)然后转到 "down" 到第一个 ContainerOfSubFoo 并获取所有children 的 SubFooType
GetSubFoo 方法在 Foo 上 class
如果需要,我可以提供 SelectionFactory 的代码。
Another problem I see now is that the checkbox "V" does not save :/
(the string is saved with the values comma seperated but the checkboxes
are all unchecked
通过为 ID 添加 .ToString() 解决了这个问题
在选择工厂中,您可以通过方便的扩展方法 EPiServer.Cms.Shell.Extensions.FindOwnerContent() 在 EPiServer 传入的 ExtendedMetadata 上获取当前内容:
public virtual IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
{
var selections = new List<SelectItem>();
var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
var ownerContent = metadata.FindOwnerContent();
if (ownerContent is Foo)
{
var containerRoot = contentRepository.GetChildren<ContainerOfSubFoo>(ownerContent.ParentLink).FirstOrDefault();
var pageOptions = contentRepository.GetChildren<SubFoo>(containerRoot.ContentLink);
foreach (var target in pageOptions)
{
selections.Add(new SelectItem() { Value = target.ContentLink.ID.ToString(), Text = target.SubFooProperty });
}
}
return selections;
}
然后您可以遍历页面树来查找您需要的内容。
我在 EPI CMS 中有以下树:
[Root]
.
.
--[Lobby] ID=1
--Foo1
--Foo2
--Foo3
--[ContainerOfSubFoo] ID=2
--SubFoo1
--SubFoo2
--SubFoo3
我希望在编辑 Foo1 时,有所有 SubFoo 的复选框。
我现在的是这样的:
private static List<SelectItem> GetSubFoos()
{
PageReference pRef = new PageReference(2); //(ID=2 is my container page - ContainerOfSubFoo)
PageData root = DataFactory.Instance.GetPage(pRef);
var pages = DataFactory.Instance.GetChildren<Models.Pages.SubFoo>(root.ContentLink);
List<SelectItem> targetsList = new List<SelectItem>();
foreach (var target in pages)
{
targetsList.Add(new SelectItem() { Value = target.ContentLink.ID.ToString(), Text = target.SubFooProperty });
}
return targetsList;
}
这很好用,但我不想使用 ID=2,我希望 GetSubFoos 转到 "up"(到大厅)然后转到 "down" 到第一个 ContainerOfSubFoo 并获取所有children 的 SubFooType
GetSubFoo 方法在 Foo 上 class 如果需要,我可以提供 SelectionFactory 的代码。
Another problem I see now is that the checkbox "V" does not save :/ (the string is saved with the values comma seperated but the checkboxes are all unchecked
通过为 ID 添加 .ToString() 解决了这个问题
在选择工厂中,您可以通过方便的扩展方法 EPiServer.Cms.Shell.Extensions.FindOwnerContent() 在 EPiServer 传入的 ExtendedMetadata 上获取当前内容:
public virtual IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
{
var selections = new List<SelectItem>();
var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
var ownerContent = metadata.FindOwnerContent();
if (ownerContent is Foo)
{
var containerRoot = contentRepository.GetChildren<ContainerOfSubFoo>(ownerContent.ParentLink).FirstOrDefault();
var pageOptions = contentRepository.GetChildren<SubFoo>(containerRoot.ContentLink);
foreach (var target in pageOptions)
{
selections.Add(new SelectItem() { Value = target.ContentLink.ID.ToString(), Text = target.SubFooProperty });
}
}
return selections;
}
然后您可以遍历页面树来查找您需要的内容。