Как добавить динамические htmlAttributes в htmlhelper ActionLinks? - PullRequest
0 голосов
/ 20 марта 2010

На моей главной странице у меня есть меню верхнего уровня, созданное с помощью 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 ]

2 голосов
/ 20 марта 2010

Вы можете написать свой собственный метод расширения для этого (извините за мой 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> 
0 голосов
/ 20 марта 2010

Из звуков этого вы можете захотеть что-то вроде этого.

Создайте конструктор по умолчанию для каждого контроллера и установите значение в ViewData.

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

Тогда в вашем файле Site.Master вы можете сделать это:

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

Это можно немного почистить, но вы поняли.

...