如何按类别过滤页面列表以显示为导航
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();
在 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();