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

How to filter a list of Pages by Category to display as a navigation

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

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

我已经修改了一段时间,但我遇到的问题似乎是从 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 查询中 use/access 页面上的自定义字段“类别”?还是我必须以其他方式解决这个问题? 预先感谢您的指导!

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

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