我正在Orchard建立一个大约130页的网站。我们设置了一个名为“主菜单”的导航菜单,其中所有页面都设置在一个层次结构中(我显示的示例来自我的沙箱站点,而不是我们的实际开发站点)。
在我的默认小部件图层的“AsideFirst”区域中,我添加了一个引用上述“主菜单”的菜单小部件。开始级别设置为0,要显示的级别设置为0.在前端,使用形状跟踪器,我创建了一个名为“Parts.MenuWidget-AsideFirst.cshtml”的替代。
菜单渲染得很好,但是,我不知道从哪里开始修改核心“导航”驱动程序以允许我只显示相对于我所在页面的页面。例如,如果我在“测试II”页面上,我想要导航以下HTML:
<ul>
<li><a href="/testing-i/">Testing I</a></li>
<li>
<a href="/testing-ii/" class="active">Testing II</a>
<ul>
<li><a href="/bark-bark/"></a></li>
</ul>
</li>
<li><a href="/testing-iii/">Testing III</a>
</ul>
我正在使用的备用代码具有以下代码。如果我在任何顶级部分内,而不是更深层次,这是有效的。下面的代码不是Orchard做事的方式,所以我想知道如何通过驱动程序和处理程序来实现这一点 - 特别是因为这还没有完成我需要的东西。
@{
var navTag = Tag(Model, "nav");
navTag.AddCssClass("nav-sidebar");
@navTag.StartElement;
var ulTag = Tag(Model, "ul");
@ulTag.StartElement
// Model is Model.Menu from the layout (Layout.Menu)
var items = getSectionItems((IList<dynamic>)Enumerable.Cast<dynamic>(Model.Menu.Items));
// Add First and Last Classes
if (items.Any())
{
items[0].Classes.Add("first");
items[items.Count - 1].Classes.Add("last");
}
// List Items
foreach (var listModel in items)
{
// Current URL
string requestUrl = getRequestUrl();
string modelUrl = getModelUrl(listModel);
bool showMenu = false;
if (isActivePage(requestUrl, modelUrl))
{
listModel.Classes.Add("active");
showMenu = true;
}
if (showMenu)
{
// Sub Items
var listItems = Enumerable.Cast<dynamic>((System.Collections.IEnumerable)listModel);
if (listItems.Any())
{
listModel.Classes.Add("dropdown");
}
// List Tag
var liTag = Tag(listModel, "li");
@liTag.StartElement;
listModel.Metadata.Alternates.Clear();
listModel.Metadata.Type = "MenuItemLink";
// Top Level Nav Items
string className = System.Text.RegularExpressions.Regex.Replace(listModel.Href, "[^A-Za-z0-9-]", "");
className = className.Length > 0 ? className : "home";
<a href="@listModel.Href" class="@className">@listModel.Text</a>
if (listItems.Any())
{
<ul>
@DisplayChildren(listModel)
</ul>
}
@liTag.EndElement;
}
}
@ulTag.EndElement;
@navTag.EndElement;
}
@functions{
private IList<dynamic> getSectionItems(IList<dynamic> sectionItems)
{
return sectionItems;
}
private string getRequestUrl()
{
return Request.Path.Replace(Request.ApplicationPath, string.Empty).TrimEnd('/').ToUpperInvariant();
}
private string getModelUrl(dynamic listModel)
{
return listModel.Href.Replace(Request.ApplicationPath, string.Empty).TrimEnd('/').ToUpperInvariant();
}
private bool isActivePage(string requestUrl, string modelUrl)
{
if (requestUrl == modelUrl || (!string.IsNullOrEmpty(modelUrl) && requestUrl.StartsWith(modelUrl + "/")))
{
return true;
}
return false;
}
}
答案 0 :(得分:0)
我使用以下代码解决了这个问题。我很亲密,但我希望我还有更好的解决方案。它解决了这个问题,最多可达4级。
@{
var navTag = Tag(Model, "nav");
navTag.AddCssClass("nav-sidebar");
@navTag.StartElement;
var ulTag = Tag(Model, "ul");
@ulTag.StartElement
// Model is Model.Menu from the layout (Layout.Menu)
string requestUrl = getRequestUrl();
var menus = (IList<dynamic>)Enumerable.Cast<dynamic>(Model.Menu.Items);
var items = getSectionItems(requestUrl, menus);
// List Items
foreach (var listModel in items)
{
// Sub Items
var listItems = Enumerable.Cast<dynamic>((System.Collections.IEnumerable)listModel);
if (listItems.Any())
{
listModel.Classes.Add("nav-section");
}
// List Tag
var liTag = Tag(listModel, "li");
@liTag.StartElement;
listModel.Metadata.Alternates.Clear();
listModel.Metadata.Type = "MenuItemLink";
// Top Level Nav Items
string className = System.Text.RegularExpressions.Regex.Replace(listModel.Href, "[^A-Za-z0-9-]", "");
className = className.Length > 0 ? className : "home";
<a href="@listModel.Href" class="@className">@listModel.Text</a>
if (listItems.Any())
{
<ul>
@DisplayChildren(listModel)
</ul>
}
@liTag.EndElement;
}
@ulTag.EndElement;
@navTag.EndElement;
}
@functions{
private IList<dynamic> getSectionItems(string requestUrl, IList<dynamic> sectionItems1)
{
foreach (var sectionItem1 in sectionItems1)
{
if (getModelUrl(sectionItem1) == requestUrl)
return sectionItem1;
foreach (var sectionItem2 in sectionItem1)
{
if (getModelUrl(sectionItem2) == requestUrl)
return sectionItem2;
foreach (var sectionItem3 in sectionItem2)
{
if (getModelUrl(sectionItem3) == requestUrl)
return sectionItem3;
foreach (var sectionItem4 in sectionItem3)
{
if (getModelUrl(sectionItem4) == requestUrl)
return sectionItem4;
}
}
}
}
return sectionItems1;
}
private string getRequestUrl()
{
return Request.Path.Replace(Request.ApplicationPath, string.Empty).TrimEnd('/').ToUpperInvariant();
}
private string getModelUrl(dynamic listModel)
{
return listModel.Href.Replace(Request.ApplicationPath, string.Empty).TrimEnd('/').ToUpperInvariant();
}
private bool isActivePage(string requestUrl, string modelUrl)
{
if (requestUrl == modelUrl || (!string.IsNullOrEmpty(modelUrl) && requestUrl.StartsWith(modelUrl + "/")))
{
return true;
}
return false;
}
}