【问题标题】:Best way of mark the "current" navigation item in a menu在菜单中标记“当前”导航项的最佳方式
【发布时间】:2011-11-01 17:57:01
【问题描述】:

例如,在 StackOverflow 中,您可以在顶部菜单中设置以下选项:问题标签用户徽章未答复。当您位于其中一个部分时,它会以橙色突出显示。

在 ASP.NET MVC 中实现这一目标的最佳方法是什么?

到目前为止,作为概念证明,我已经完成了这个助手:

    public static String IsCurrentUrl(this UrlHelper url, String generatedUrl, String output)
    {
        var requestedUrl = url.RequestContext.HttpContext.Request.Url;

        if (generatedUrl.EndsWith("/") && !requestedUrl.AbsolutePath.EndsWith("/"))
            generatedUrl=generatedUrl.Substring(0, generatedUrl.Length - 1);

        if (requestedUrl.AbsolutePath.EndsWith(generatedUrl))
            return output;

        return String.Empty;

    }

如果当前请求与该链接匹配,则该方法将输出字符串添加到元素。所以可以这样使用:

<li>
    <a href="@Url.Action("AboutUs","Home")" @Url.IsCurrentUrl(@Url.Action("AboutUs", "Home"), "class=on")><span class="bullet">About Us</span></a>
 </li>

第一个问题,我基本上两次调用Url.Action,首先是“href”属性,然后是助手,我认为必须有更好的方法来做到这一点。第二个问题,这不是比较两个链接的最佳方法。我想我可以创建一个新的Html.ActionLink 重载,所以我不需要调用Url.Action 两次,但是有什么内置方法可以做到这一点吗?

奖励:如果我添加 "class=\"on\"",MVC 将呈现 class=""on""。为什么?

问候。

【问题讨论】:

  • 您是否考虑过使用内置的站点地图功能来管理您的活动导航节点?

标签: asp.net asp.net-mvc asp.net-mvc-3 navigation


【解决方案1】:

对于我正在进行的一个项目,我们遇到了完全相同的问题。如何突出显示当前选项卡?这是当时采取的做法:

在母版页视图中:

 <% 
   var requestActionName = 
                         ViewContext.RouteData.Values["action"].ToString();
   var requestControllerName = 
                         ViewContext.RouteData.Values["controller"].ToString();
 %>

 <li class="<%=  requestActionName.Equals("Index",
                   StringComparison.OrdinalIgnoreCase)
                   && requestControllerName.Equals("Home",
                   StringComparison.OrdinalIgnoreCase) ? 
                   "current" : string.Empty %>">
            <%: Html.ActionLink("Home", "Index", "Home") %>
  </li>

基本上,我们只是将操作和控制器值与链接关联的值进行字符串比较。如果它们匹配,那么我们将其称为当前链接,并为菜单项分配一个“当前”类。

到目前为止,这是可行的,但是随着我们的规模越来越大,这个设置开始变得相当大,有很多“或”这个“或”那个。因此,如果您决定尝试这个,请记住这一点。

祝你好运,希望这对你有所帮助。

【讨论】:

    【解决方案2】:

    使用 CSS 来实现。在服务器上,创建一个函数来识别应突出显示的站点部分,并将其输出为您的 body 标签中的 css 类:

    这篇文章解释了它: http://hicksdesign.co.uk/journal/highlighting-current-page-with-css

    【讨论】:

    • "创建一个函数来识别应该突出显示的站点部分",很好:D 这就是我正在寻找的,那个函数:D
    【解决方案3】:

    另一种方法是使用这样的扩展方法(例如 Razor 和 C#):

    @Html.MenuItem("MainPage","Index", "Home")
    

    方法:

     public static MvcHtmlString MenuItem(
                this HtmlHelper htmlHelper,
                string linkText,
                string actionName,
                string controllerName
                )
            {
                string currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action");
                string currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller");
                if (actionName == currentAction && controllerName == currentController)
                {
                    return htmlHelper.ActionLink(
                        linkText,
                        actionName,
                        controllerName,
                        null,
                        new
                            {
                                @class = "current"
                            });
                }
                return htmlHelper.ActionLink(linkText, actionName, controllerName);
            }
    

    【讨论】:

      【解决方案4】:

      不确定第一个位,但为了奖金:

      \ 是 C#(以及大多数语言)中的转义字符,它将导致下一个字符被解释为字符串,而不是 C# 运算符。

      【讨论】:

      • 对,但这就是我想要的。如果您在 HTML 代码中看到,我正在使用 C# 调用一个函数,并且我想将字符串 class="on" 作为参数传递,所以我使用了"class=\"on\"",它应该返回该字符串,但不是。
      • 好吧,如果它在您的 Razor 视图中,语义视图引擎不应该需要转义字符,除非它专门在 C# 函数中。
      猜你喜欢
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2012-02-13
      相关资源
      最近更新 更多