我需要在菜单中突出显示活动链接。顺便说一下,我的菜单在主页面中。我正在寻找实现这个的最佳方法?有任何想法吗?
答案 0 :(得分:38)
处理此问题的最佳方法是编写HTML帮助程序。您可以使用RouteData.Values["action"]
来获取当前正在执行的操作并与菜单名称进行比较,如果它们匹配,则应用将突出显示它的CSS类。
public static MvcHtmlString MenuItem(
this HtmlHelper htmlHelper,
string action,
string text
)
{
var menu = new TagBuilder("div");
var currentAction = (string)htmlHelper.ViewContext.RouteData.Values["action"];
if (string.Equals(
currentAction,
action,
StringComparison.CurrentCultureIgnoreCase)
)
{
menu.AddCssClass("highlight");
}
menu.SetInnerText(text);
return MvcHtmlString.Create(menu.ToString());
}
然后使用此帮助程序呈现菜单项:
<%: Html.MenuItem("about", "About us") %>
<%: Html.MenuItem("contact", "Contact us") %>
...
答案 1 :(得分:7)
我一直在使用这个解决方案 Html部分
<ul>
@Html.ListItemAction("Home Page","Index","Home")
@Html.ListItemAction("Manage","Index","Home")
</ul>
帮手部分
public static class ActiveLinkHelper
{
public static MvcHtmlString ListItemAction(this HtmlHelper helper, string name, string actionName, string controllerName)
{
var currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
var currentActionName = (string)helper.ViewContext.RouteData.Values["action"];
var sb = new StringBuilder();
sb.AppendFormat("<li{0}", (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) &&
currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase)
? " class=\"active\">" : ">"));
var url = new UrlHelper(HttpContext.Current.Request.RequestContext);
sb.AppendFormat("<a href=\"{0}\">{1}</a>", url.Action(actionName, controllerName), name);
sb.Append("</li>");
return new MvcHtmlString(sb.ToString());
}
}
答案 2 :(得分:0)
我很确定你可以用纯CSS做到这一点。它涉及类选择器和身体标签。我会在每周的每一天都使用辅助方法。
答案 3 :(得分:0)
我使用这个解决方案:
首先 - 将属性data-menuPageId添加到菜单链接
<ul class="menu">
<li data-menuPageId="home">
@(Html.Link<HomeController>(x => x.Index(), "Home"))
</li>
<li data-menuPageId="products">
@(Html.Link<ProductsController>(x => x.Index(), "Products"))
</li>
</li>
下一步 - 将当前页面ID的隐藏字段添加到Layout.cshtml
<input type="hidden" id="currentPageId" value="@(ViewBag.Page ?? "home")" />
在Home或Products等页面上添加ViewBag.Page初始化
@{
ViewBag.Page = "products";
}
最后一件事你应该从yor Layout.cshtml中引用这个javascipt
$(function() {
var pageIdAttr = "data-menuPageId";
var currentPage = $("#currentPageId").attr("value");
var menu = $(".menu");
$("a[" + pageIdAttr + "]").removeClass("selected");
$("a[" + pageIdAttr + "=\"" + currentPage + "\"]", menu).addClass("selected");
});
答案 4 :(得分:0)
在布局中尝试如下:
@{
string url = Request.RawUrl;
}
@switch (url)
{
case "/home/":
@Html.ActionLink("Home", "../home/", null, new { @style = "background:#00bff3;" })
@Html.ActionLink("Members", "../home/MembersList/")
break;
case "/home/MembersList/":
@Html.ActionLink("Home", "../home/")
@Html.ActionLink("Members", "../home/MembersList/", null, new { @style = "background:#00bff3;" })
break;
default:
@Html.ActionLink("Home", "../home/")
@Html.ActionLink("Members", "../home/MembersList/")
break;
}
答案 5 :(得分:0)
如果您还要附上控制器信息,请查看此链接
答案 6 :(得分:0)
最简单的解决方案:
1)将jQuery连接到@RenderBody()
2)在布局上
...
<li class="nav-item">
<a class="nav-link text-dark" id="navItemPortfolio" asp-area="" asp-controller="Home" asp-action="Portfolio">Portfolio</a>
</li>
...
3)在您的页面上写类似的内容(查看)
<script>
$(function () {
$("#navItemPortfolio").addClass("active");
});
</script>