微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。