如何使TreeProvider.SelectNodes像CMSRepeater一样以预览模式返回所有数据

时间:2018-11-06 08:48:39

标签: kentico

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

工程

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

不起作用

private DataSet LoadRepeaterItemsWithoutCache()
    {
        var columns = @"col1,col2";
        var path ="./%";
        TreeProvider tree = new TreeProvider();
        return tree.SelectNodes("MyClassName")
                                .OnCurrentSite()
                                .Path(path)
                                .OrderBy("NodeOrder")
                                .NestingLevel(1)
                                //.Published(true/false)
                                //.CheckPermissions(true/false)
                                .CombineWithDefaultCulture(false)
                                .Columns(columns);
    }

var tnds = LoadRepeaterItemsWithoutCache();

            rep2.DataBindByDefault = false;
            rep2.HideControlForZeroRows = true;
            if (!DataHelper.DataSourceIsEmpty(tnds))
            {
                rep2.DataSource = tnds;
                rep2.DataBind();
            }

2 个答案:

答案 0 :(得分:1)

看起来您需要稍微修改一下查询。您的函数期望将DataSet作为返回值,而您正在返回ObjectQuery。如果您想要或需要返回DataSet,请在.Result方法的末尾添加.SelectNodes()

.Columns(columns).Result;

另一个选择是返回一个ObjectQuery并将其简单地分配给转发器,然后让自然生命周期处理事物。

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

答案 1 :(得分:0)

我认为您可以尝试这种方式:

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,则仅返回已发布节点,否则返回已发布和未发布节点。 我尚未对其进行测试,但希望它能起作用。