这是一篇关于如何将导航项动态注入菜单的非常好的帖子:http ://www.davidhayden.me/blog/dynamically-injecting-menu-items-in-orchard-cms
此外,如果您使用的是 Orchard 1.6,我将应用此修复程序,以便在您注销时显示项目(如果您不更新 NavigationManager.cs 类中的 Reduce 方法,则会出现权限问题:https://orchard .codeplex.com/workitem/19318#CommentContainer1
编辑:
using System.Collections.Generic;
using System.Linq;
using Orchard.ContentManagement;
using Orchard.Localization;
using Orchard.Projections.Models;
using Orchard.Projections.Services;
using Orchard.UI.Navigation;
namespace Orchard.Projections.Navigation {
/// <summary>
/// Dynamically injects query results as menu items on NavigationQueryMenuItem elements
/// </summary>
public class NavigationQueryProvider : INavigationFilter {
private readonly IContentManager _contentManager;
public NavigationQueryProvider(IContentManager contentManager) {
_contentManager = contentManager;
}
public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> items) {
foreach (var item in items) {
if (item.Content != null && item.Content.ContentItem.ContentType == "CompanyMenuItem") {
var containedItems = GetContainedItems(item.Id).Select(record => new MenuItem{
//fill all properties
};
var menuPosition = item.Position;
int index = 0;
foreach (var contentItem in contentItems) {
if (contentItem != null) {
var part = contentItem;
var menuText = _contentManager.GetItemMetadata(part).DisplayText;
var routes = _contentManager.GetItemMetadata(part).DisplayRouteValues;
var inserted = new MenuItem {
Text = new LocalizedString(menuText),
IdHint = item.IdHint,
Classes = item.Classes,
Url = item.Url,
Href = item.Href,
LinkToFirstChild = false,
RouteValues = routes,
LocalNav = item.LocalNav,
---> Items = containedItems,
Position = menuPosition + ":" + index++,
Permissions = item.Permissions,
Content = part
};
yield return inserted;
}
}
}
else {
yield return item;
}
}
}
public IEnumerable<ContentItem> GetContainedtems(int Id) {
var container = _contentManager.Query<ContainerPart>().List().SingleOrDefault(x => x.Id == Id);
IContentQuery<ContentItem> query = _contentManager
.Query(VersionOptions.Published)
.Join<CommonPartRecord>()
.Where(x => x.Container.Id == Id);
var descendingOrder = container.OrderByDirection == (int)OrderByDirection.Descending;
query = query.OrderBy(container.OrderByProperty, descendingOrder);
var contentItems = query.List();
return contentItems;
}
}
}
注意*我没有对此进行测试,但基本上我认为最好的方法是创建一个容器并添加特定公司的所有相关内容项,然后查询包含的项。只需将 Containable 和 Container 部分添加到页面内容类型(或您使用的任何内容类型)。