Kentico 如何让TreeProvider.SelectNodes像CMSRepeater一样在预览模式下返回所有数据

Kentico 如何让TreeProvider.SelectNodes像CMSRepeater一样在预览模式下返回所有数据,kentico,Kentico,如果我将数据查询作为CMSRepeater的属性提供,则中继器将在预览模式下显示所有项目(已发布或未发布),并且仅在实时站点上显示已发布的项目。 但是,如果我试图将数据源传递给中继器,我无法让它执行相同的操作。 我是否缺少某些属性或方法 有效 <cms:CMSRepeater ID="rep2" runat="server" EnableViewState="true" Path="./%" OrderBy="NodeOrder ASC"

如果我将数据查询作为CMSRepeater的属性提供,则中继器将在预览模式下显示所有项目(已发布或未发布),并且仅在实时站点上显示已发布的项目。
但是,如果我试图将数据源传递给中继器,我无法让它执行相同的操作。
我是否缺少某些属性或方法

有效

 <cms:CMSRepeater  ID="rep2" runat="server" EnableViewState="true" 
        Path="./%" OrderBy="NodeOrder ASC" 
                MaxRelativeLevel="1" 
                ClassNames="MyClassName"
                SelectedColumns="Col1, col2, etc">
</cms:CMSRepeater>

看起来您需要稍微修改一下查询。您的函数需要一个
数据集
作为返回值,而您正在返回一个
对象查询
。如果希望或需要返回
数据集
,请将
结果
添加到
方法的末尾

.Columns(Columns).Result

另一个选项是返回一个ObjectQuery,并简单地将其分配给repeater,让自然生命周期处理事情

public override void OnContentLoaded()
{
    //rep2.DataBindByDefault = false;
    rep2.HideControlForZeroRows = true;
    TreeProvider tree = new TreeProvider();
    rep2.DataSource = tree.SelectNodes("MyClassName")
                                .OnCurrentSite()
                                .Path(path)
                                .OrderBy("NodeOrder")
                                .NestingLevel(1)
                                //.Published(true/false)
                                //.CheckPermissions(true/false)
                                .CombineWithDefaultCulture(false)
                                .Columns(columns);
}

我想你可以这样做:

private DataSet LoadRepeaterItemsWithoutCache()
{
    var columns = @"col1,col2";
    var path ="./%";
    TreeProvider tree = new TreeProvider();
    var datasource = tree.SelectNodes("MyClassName")
                            .OnCurrentSite()
                            .Path(path)
                            .OrderBy("NodeOrder")
                            .NestingLevel(1)
                            //.Published(true/false)
                            //.CheckPermissions(true/false)
                            .CombineWithDefaultCulture(false)
                            .Columns(columns);
     //If is in LiveSite mode, then return only published
     if (PortalContext.ViewMode == ViewModeEnum.LiveSite)
         datasource = datasource.Published();

     return datasource;
}
在返回数据源之前,请检查站点是否处于LiveSite模式。如果为true,则仅返回已发布的节点,否则返回已发布和未发布的节点。
我还没有测试过它,但希望它能工作。

您什么时候调用这些方法?您的属性应该在
OnContentLoaded()
事件或
OnInit()
事件中设置。@BrendenKehren我在
OnContentLoaded()
方法中调用它们,在
base.OnContentLoaded()
方法之后。只需添加到Brenden的答案中,ObjectQuery有两个参数,Published()和PublishedVersion(). Published()-此选项限制数据集。它告诉方法只返回已发布版本可用的项。因此,这一个将从返回的items PublishedVersion()中删除未发布的项-这一个告诉您要获取什么样的数据。在这种情况下,最新发布版本的数据。因此,在某些情况下,您可能需要同时使用这两种方式。@BrendenKehren遗憾的是,这仍然只提取已发布的项目,而不管查看模式如何。由于某些原因,在处理数据时,中继器以预览模式(需要)显示未发布的项目,但分配数据源不会。我想最坏的情况是我只能在livesite模式下使用数据集。
private DataSet LoadRepeaterItemsWithoutCache()
{
    var columns = @"col1,col2";
    var path ="./%";
    TreeProvider tree = new TreeProvider();
    var datasource = tree.SelectNodes("MyClassName")
                            .OnCurrentSite()
                            .Path(path)
                            .OrderBy("NodeOrder")
                            .NestingLevel(1)
                            //.Published(true/false)
                            //.CheckPermissions(true/false)
                            .CombineWithDefaultCulture(false)
                            .Columns(columns);
     //If is in LiveSite mode, then return only published
     if (PortalContext.ViewMode == ViewModeEnum.LiveSite)
         datasource = datasource.Published();

     return datasource;
}