ASP.NET MVC - Подсветка текущей страницы в навигации - PullRequest
15 голосов
/ 15 февраля 2012

Мне интересно, как можно добавить класс CSS к текущей странице в вашей навигации при использовании ASP.NET MVC 3?Вот моя навигация в моем файле _Layout.cshtml:

<p>@Html.ActionLink("Product Search", "Index", new { controller = "Home" }, new { @class = "current" })
                | @Html.ActionLink("Orders", "Index", new { controller = "Orders" }) 
                | @Html.ActionLink("My Account", "MyAccount", new { controller = "Account" })
                | @Html.ActionLink("Logout", "LogOff", new { controller = "Account" })</p>

Как вы можете видеть, у меня есть 4 ссылки в моей навигации с первой, к которой применен CSS-класс «current», я хотел бычтобы иметь возможность добавлять / удалять этот класс для различных ссылок в моей навигации в зависимости от того, на какой странице находится пользователь.Возможно ли это?

Приветствия

Ответы [ 5 ]

25 голосов
/ 15 февраля 2012

Вы можете сделать это

@{ 
   var currentController = ViewContext.RouteData.Values["controller"] as string ?? "Home";
   var currentAction = ViewContext.RouteData.Values["action"] as string ?? "Index";
   var currentPage = (currentController + "-" + currentAction ).ToLower();
}

@Html.ActionLink("Product Search", "Index", "Home", null,
                 new { @class = currentPage == "home-index" ? "current" : "" })
@Html.ActionLink("MyAccount", "MyAccount", "Account", null,
                  new { @class = currentPage == "account-myaccount" ? "current" : "" })
14 голосов
/ 28 июля 2014

Я бы рекомендовал использовать для этого метод расширения.Что-то вроде:

public static HtmlString NavigationLink(
    this HtmlHelper html,
    string linkText,
    string actionName,
    string controllerName)
{
    string contextAction = (string)html.ViewContext.RouteData.Values["action"];
    string contextController = (string)html.ViewContext.RouteData.Values["controller"];

    bool isCurrent =
        string.Equals(contextAction, actionName, StringComparison.CurrentCultureIgnoreCase) &&
        string.Equals(contextController, controllerName, StringComparison.CurrentCultureIgnoreCase);

    return html.ActionLink(
        linkText,
        actionName,
        controllerName,
        routeValues: null,
        htmlAttributes: isCurrent ? new { @class = "current" } : null);
}

Затем вы можете использовать его в своем представлении, включив пространство имен вашего внутреннего номера и просто вызвав свой метод:

@using MyExtensionNamespace;

...

  @Html.NavigationLink("Product Search", "Index", "Home")
| @Html.NavigationLink("Orders", "Index", "Orders") 
| @Html.NavigationLink("My Account", "MyAccount", "Account")
| @Html.NavigationLink("Logout", "LogOff", "Account")

Это позволяет сохранить бритвунемного чище и легко используется в других видах.

8 голосов
/ 27 сентября 2012
@{
   var controller = ViewContext.RouteData.Values["controller"].ToString();
   var action = ViewContext.RouteData.Values["action"].ToString();
   var isActiveController = new Func<string, string, string, string, string>((ctrl, act, activeStyle, inactiveStyle) => controller == ctrl && action == act ? activeStyle : inactiveStyle);
 }

Тогда в вашем атрибуте класса в вашем HTML вы можете сделать:

class="@isActiveController("controlername","action","activecssstyleclass","inactiveccsstyle")"

Просто еще один способ @dknaack его ответа ... немного более общий и менее функциональный, чтобы повторяться в вашем коде.

4 голосов
/ 11 июля 2016

В моем случае предположим, что у меня есть домашняя страница и меню.

Добавьте ViewBag.Active в качестве заполнителя на домашней странице, например:

@{
   ViewBag.Title = "Home";
   ViewBag.Active = "Home";
}

Затем поместите его в класс li, чтобы активировать его или нет:

 <li class="@(ViewBag.Active=="Home"? "active" : "")">
      <a href="@Url.Action("Index", "Home")"><span>@ViewBag.Title</span></a>
 </li>
2 голосов
/ 20 сентября 2013

Я использовал этот урок, чтобы сделать это, это намного проще для понимания и занимает 2 минуты Hightlight Активный пункт меню

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...