Asp.Net Mvc突出显示当前的页面链接技术?

时间:2010-09-04 19:06:43

标签: asp.net asp.net-mvc

我需要在菜单中突出显示活动链接。顺便说一下,我的菜单在主页面中。我正在寻找实现这个的最佳方法?有任何想法吗?

7 个答案:

答案 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)

如果您还要附上控制器信息,请查看此链接

https://stackoverflow.com/a/20411015/875708

答案 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>