如何将动态htmlAttributes添加到htmlhelper ActionLinks?

时间:2010-03-20 16:05:26

标签: asp.net-mvc vb.net html-helper

在我的母版页中,我有一个使用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 个答案:

答案 0 :(得分:2)

你可以为此编写自己的扩展方法(抱歉我的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> 

答案 1 :(得分:0)

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

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

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

然后在您的Site.Master文件中,您可以执行以下操作:

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

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