问题描述
在 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();