1

我在 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 “向上”(到 Lobby)然后“向下”到第一个 ContainerOfSubFoo 并获取 SubFooType 的所有子项

GetSubFoo 方法在 Foo 类上,如果需要,我可以提供 SelectionFactory 的代码。

我现在看到的另一个问题是复选框“V”不保存:/(字符串以逗号分隔的值保存,但复选框均未选中

这是通过为 ID 添加 .ToString() 来解决的

4

1 回答 1

2

在选择工厂中,您可以通过方便的扩展方法 EPiServer.Cms.Shell.Extensions 获取当前内容。在 EPiServer传入的 ExtendedMetadata 上的FindOwnerContent() :

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;
}

然后,您可以遍历页面树以找到所需的内容。

于 2015-12-31T10:42:20.240 回答