我在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能够进入&#34; up&#34; (到大堂)然后去&#34; down&#34;到第一个ContainerOfSubFoo并获取SubFooType的所有子项
GetSubFoo方法在Foo类上 如果需要,我可以提供SelectionFactory的代码。
我现在看到的另一个问题是复选框&#34; V&#34;不保存:/ (该字符串以逗号分隔,但复选框保存 都未经检查
这是通过为ID
添加.ToString()来解决的答案 0 :(得分:2)
在选择工厂中,您可以通过EPiServer传入的ExtendedMetadata上的方便扩展方法EPiServer.Cms.Shell.Extensions。 FindOwnerContent()获取当前内容: p>
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;
}
然后,您可以遍历页面树以找到所需内容。