代码之家  ›  专栏  ›  技术社区  ›  Magnus Johansson

如何在ASP.NET MVC中直观地指示当前页?

  •  17
  • Magnus Johansson  · 技术社区  · 15 年前

    作为讨论的基础。创建标准的ASP.NET MVC Web项目。

    它将在母版页中包含两个菜单项:

    <div id="menucontainer">
      <ul id="menu">
        <li>
          <%= Html.ActionLink("Home", "Index", "Home")%></li>
        <li>
          <%= Html.ActionLink("About", "About", "Home")%></li>
      </ul>
    </div>
    

    如何设置指示当前页面的视觉CSS样式。 例如,在“关于页面/控制器”中,我基本上想这样做:

    <%= Html.ActionLink("About", "About", "Home", new {class="current"})%></li>
    

    当然,在主页上:

    <%= Html.ActionLink("Home", "Index", "Home", new {class="current"})%></li>
    

    (具有当前的CSS样式名,在菜单中直观地指示这是当前页。)

    我可以将菜单分区从母版页拆分为内容占位符,但这意味着我必须将菜单放到每一页上。

    有什么办法吗?有没有好的解决办法?

    5 回复  |  直到 9 年前
        1
  •  24
  •   tvanfosson    15 年前

    最简单的方法是从ViewContext的RouteData获取当前控制器和操作。注意签名的更改,并使用@来转义关键字。

    <% var controller = ViewContext.RouteData.Values["controller"] as string ?? "Home";
       var action = ViewContext.RouteData.Values["action"] as string ?? "Index";
       var page = (controller + ":" + action).ToLower();
     %>
    
    <%= Html.ActionLink( "About", "About", "Home", null,
                         new { @class = page == "home:about" ? "current" : "" ) %>
    <%= Html.ActionLink( "Home", "Index", "Home", null,
                         new { @class = page == "home:index" ? "current" : "" ) %>
    

    请注意,您可以将此扩展组合成类似@jon的htmlhelper扩展,并使其更清晰。

    <%= Html.MenuLink( "About", "About", "Home", null, null, "current" ) %>
    

    其中menuActionLink是

    public static class MenuHelperExtensions
    {
         public static string MenuLink( this HtmlHelper helper,
                                        string text,
                                        string action,
                                        string controller,
                                        object routeValues,
                                        object htmlAttributes,
                                        string currentClass )
         {
             RouteValueDictionary attributes = new RouteValueDictionary( htmlAttributes );
             string currentController = helper.ViewContext.RouteData.Values["controller"] as string ?? "home";
             string currentAction = helper.ViewContext.RouteData.Values["action"] as string ?? "index";
             string page = string.Format( "{0}:{1}", currentController, currentAction ).ToLower();
             string thisPage = string.Format( "{0}:{1}", controller, action ).ToLower();
             attributes["class"] = (page == thisPage) ? currentClass : "";
            return helper.ActionLink( text, action, controller, new RouteValueDictionary( routeValues ), attributes );
         }
    }
    
        2
  •  1
  •   Jon    15 年前

    我最近为此创建了一个HTML助手,它看起来像:

    public static string NavigationLink(this HtmlHelper helper, string path, string text)
    {
        string cssClass = String.Empty;
        if (HttpContext.Current.Request.Path.IndexOf(path) != -1)
        {
            cssClass = "class = 'selected'";
        }
    
        return String.Format(@"<li><a href='{0}' {1}>{2}</a></li>", path, cssClass, text);
    }
    

    实现如下:

      <ul id="Navigation">
      <%=Html.NavigationLink("/Path1", "Text1")%>
      <%=Html.NavigationLink("/Path2", "Text2")%>
      <%=Html.NavigationLink("/Path3", "Text3")%>
      <%=Html.NavigationLink("/Path4", "Text4")%>
      </ul>
    
        3
  •  1
  •   Jason Wicker    13 年前

    如果您使用的是T4MVC,则可以使用:

            public static HtmlString MenuLink(
            this HtmlHelper helper,
            string text,
            IT4MVCActionResult action,
            object htmlAttributes = null)
        {
            var currentController = helper.ViewContext.RouteData.Values["controller"] as string ?? "home";
            var currentAction = helper.ViewContext.RouteData.Values["action"] as string ?? "index";
    
            var attributes = new RouteValueDictionary(htmlAttributes);
            var cssClass = (attributes.ContainsKey("class"))
                               ? attributes["class"] + " "
                               : string.Empty;
    
            string selectedClass;
            if(action.Controller.Equals(currentController, StringComparison.InvariantCultureIgnoreCase)
            {
                selectedClass = "selected-parent";
                if(action.Action.Equals(currentAction, StringComparison.InvariantCultureIgnoreCase))
                    selectedClass = "selected";
            }
            cssClass += selectedClass;
    
            attributes["class"] = cssClass;
    
            return helper.ActionLink(text, (ActionResult)action, attributes);
        }
    
        4
  •  0
  •   Erik van Brakel scottrakes    15 年前

    它可能只是第五个参数,所以在HTML属性之前插入一个空值。这里的这篇文章就是这样描述的,尽管您可以在第4个参数中传递一些内容,但是第5个参数是专门针对htmlattributes的。

        5
  •  0
  •   Netferret    10 年前
    <script type="javascript/text">
    $( document ).ready( function() {
    
            @if (Request.Url.AbsolutePath.ToLower() == "/") 
            {
                @Html.Raw("$('.navbar-nav li').eq(0).attr('class','active');")
            }
    
            @if (Request.Url.AbsolutePath.ToLower().Contains("details")) 
            {
                @Html.Raw("$('.navbar-nav li').eq(1).attr('class','active');")
            }
    
            @if (Request.Url.AbsolutePath.ToLower().Contains("schedule")) 
            {
                @Html.Raw("$('.navbar-nav li').eq(2).attr('class','active');")
            }
    
        });
    </script>
    

    把这个放在一起5分钟,我可以重构它,但应该给你一个基本的想法,它可能对较小的站点最有用。