如何按类别过滤页面列表以显示为导航

问题描述

在 Sitefinity v12.x 中,我想创建一个小部件,允许用户选择一个或多个类别(分层分类)用作过滤条件,然后小部件将查询分配了这些类别的页面他们。从表面上看,这似乎很简单,但我似乎无法将其整合在一起。

我已经将“类别”作为自定义字段添加页面数据中,并且我已经创建了我的测试页面。我正在努力构建可以访问自定义字段“类别”的查询,然后将这些与用户提供的类别进行比较。

我已经修补了一段时间,但似乎我遇到的问题是从 Linq 查询中检索分配给页面的类别。我已经尝试过 var categories = pageNode.GetValue("Category") 并按预期工作。但是,当我尝试在 Linq 查询中使用 .GetValue("Category") 方法时,这似乎无效,以下是我的意思的示例:

var pageManager = PageManager.GetManager();
var pages = pageManager.GetPageDataList().Where(pageData =>
        (pageData.Culture == "en" ||
        pageData.NavigationNode.LocalizationStrategy != Telerik.Sitefinity.Localization.LocalizationStrategy.Split) &&
        pageData.NavigationNode.NodeType == Telerik.Sitefinity.Pages.Model.NodeType.Standard &&
        pageData.NavigationNode.RootNodeId == Telerik.Sitefinity.Abstractions.SiteInitializer.CurrentFrontendRootNodeId &&
        pageData.Status == ContentLifecycleStatus.Live)
    .Select(x => x.NavigationNode);

foreach (PageNode page in pages)
{
    // This properly retrieves Categories assigned to a Page in the Debug window
    var categories = page.GetValue("Category"); 
}

// This does not work,error message below .Any() reads: 'object' does not contain a deFinition for 'Any' and no accessible extension method 'Any' accepting a first argument of type 'object' Could be found
var categoryPages = pages
    .Where(pageData => pageData.GetValue("Category").Any())
    .ToList();

有什么方法可以在 Linq 查询中使用/访问页面上的自定义字段“类别”?或者我必须以其他方式解决这个问题吗? 提前感谢您的指导!

解决方法

请注意,不要忘记过滤可见和未删除的页面。

pageData.Status == ContentLifecycleStatus.Live && pageData.IsDeleted == false && pageData.Visible == true)
,

您应该将 pageData.GetValue("Category") 转换为任一 Guid 吗?或 IEnumerable 取决于您如何准确设置自定义字段。

,

谢谢大家的提示!我能够通过在 Linq 查询中指定自定义值的类型来对其进行排序,如下所示:pageData.GetValue<TrackedList<Guid>>("Category"),这是我想出的:

var pageManager = PageManager.GetManager();
var pages = pageManager.GetPageDataList().Where(pageData =>
        (pageData.Culture == "en" ||
        pageData.NavigationNode.LocalizationStrategy != Telerik.Sitefinity.Localization.LocalizationStrategy.Split) &&
        pageData.NavigationNode.NodeType == NodeType.Standard &&
        pageData.NavigationNode.RootNodeId == Telerik.Sitefinity.Abstractions.SiteInitializer.CurrentFrontendRootNodeId &&
        pageData.Status == ContentLifecycleStatus.Live && pageData.Visible == true)
    .Select(x => x.NavigationNode);

var filteredPages = pages
    .Where(pageData => categoriesQuery.All(c => pageData.GetValue<TrackedList<Guid>>("Category").Contains(c)))
    .ToList();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...