在菜单中标记“当前”导航项的最佳方法

时间:2011-11-01 17:57:02

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

例如,在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""。为什么呢?

问候。

4 个答案:

答案 0 :(得分:2)

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

在母版页视图中:

 <% 
   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>

基本上发生的事情是,我们只是将动作和控制器值与链接相关的值进行字符串比较。如果匹配,那么我们就会调用当前链接,然后我们分配一个“当前”链接。菜单项的类。

现在到目前为止,这是有效的,但随着我们的规模变得越来越大,这个设置开始变得相当大,有很多&#39;或者&#39;这个&#39;或&#39;那。所以,如果你决定尝试这个,请保持这种想法。

祝你好运,希望这会帮助你解决一些问题。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

另一种方法是使用这样的扩展方法(示例中为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);
        }

答案 3 :(得分:0)

不确定第一位,但奖励:

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