代码之家  ›  专栏  ›  技术社区  ›  camainc

如何将动态htmlattributes添加到htmlhelper actionLinks?

  •  0
  • camainc  · 技术社区  · 16 年前

    在我的母版页中,我有一个使用ActionLinks创建的顶级菜单:

    <ul id="topNav">
      <li><%=Html.ActionLink("Home", "Index", "Home")%></li>
      <li><%=Html.ActionLink("News", "Index", "News")%></li>
      <li><%=Html.ActionLink("Projects", "Index", "Projects")%></li>
      <li><%=Html.ActionLink("About", "About", "Home")%></li>
      <li><%=Html.ActionLink("Contact", "Contact", "Home")%></li>
      <li><%=Html.ActionLink("Photos", "Photos", "Photos")%></li>
    </ul> 
    

    我想动态地将一个名为“current”的类添加到站点当前指向的链接中。例如,当站点位于主页时,菜单链接的呈现方式如下:

    <li><a class="current" href="/">Home</a></li>
    

    我是否需要重载actionLink方法来实现这一点,或者创建一个全新的HTMLHelper,或者有更好的方法吗?

    我对MVC还比较陌生,所以我不知道怎么做才是正确的。

    事先谢谢。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Darin Dimitrov    16 年前

    您可以为此编写自己的扩展方法(抱歉,我的vb有点生疏):

    <Extension> _
    Public Shared Function MyActionLink( _
        ByVal htmlHelper As HtmlHelper, _ 
        ByVal linkText As String, _ 
        ByVal actionName As String, _ 
        ByVal controllerName As String) As MvcHtmlString
    
        Dim currentAction As String = TryCast(htmlHelper.ViewContext.RouteData.Values.Item("action"), String)
        Dim currentController As String = TryCast(htmlHelper.ViewContext.RouteData.Values.Item("controller"), String)
        If ((actionName = currentAction) AndAlso _
            (controllerName = currentController)) _ 
        Then
            Return htmlHelper.ActionLink( _
                linkText, _
                actionName, _
                controllerName, _ 
                Nothing, _
                New { _
                    .class = "current" _
                })
        End If
        Return htmlHelper.ActionLink(linkText, actionName, controllerName)
    End Function
    

    你可以这样使用:

    <ul id="topNav">
      <li><%=Html.MyActionLink("Home", "Index", "Home")%></li>
      <li><%=Html.MyActionLink("News", "Index", "News")%></li>
      <li><%=Html.MyActionLink("Projects", "Index", "Projects")%></li>
      <li><%=Html.MyActionLink("About", "About", "Home")%></li>
      <li><%=Html.MyActionLink("Contact", "Contact", "Home")%></li>
      <li><%=Html.MyActionLink("Photos", "Photos", "Photos")%></li>
    </ul> 
    
        2
  •  0
  •   37Stars    16 年前

    从它的声音,你可能想要这样的东西。

    为每个控制器创建一个默认的构造函数,并在ViewData中设置一个值。

    public HomeController()
        : base()
    {
        ViewData["selected"] = "home";
    }
    

    然后在您的站点.master文件中,您可以执行以下操作:

    <li class="<%= ((ViewData["selected"] == "home") ? "current" : "") %>"><%= Html.ActionLink("Home", "Index", "Home") %></li>
    

    它可以清理一点,但你明白了。