Asp.net 最好的标记方式是;“当前”;菜单中的导航项

Asp.net 最好的标记方式是;“当前”;菜单中的导航项,asp.net,asp.net-mvc,asp.net-mvc-3,navigation,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 requestedUr

例如,在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”属性,第二次调用helper,我认为必须有更好的方法来实现这一点。第二个问题,这不是比较两个链接的最佳方法。我想我可以创建一个新的
    Html.ActionLink
    重载,这样我就不需要调用
    Url.Action
    两次,但是有什么内置方法可以做到这一点吗

    奖励:如果我在“上添加了
    ”class=\,MVC将在“
    上呈现
    class=”“。为什么?


    问候。

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


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

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

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

    在母版页视图中:

     <% 
       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>
    
    
    
  • 基本上,我们只是将动作和控制器值与链接相关的值进行字符串比较。如果它们匹配,那么我们调用当前链接,并为菜单项分配一个“当前”类

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


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

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

    方法:

     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);
            }
    

    对,但那正是我想要的。如果您在HTML代码中看到,我正在用C#调用一个函数,我想将字符串
    class=“on”
    作为参数传递,因此我使用
    “class=\”on\”
    ,它应该返回该字符串,但不是。如果它在您的Razor视图中,语义视图引擎不应该要求转义字符,除非它特别在C#函数中。您是否考虑过使用内置的SiteMap功能来管理活动导航节点?“创建一个函数来标识应该突出显示的站点部分”,很好:D这就是我要找的,该函数为:D
     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);
            }