Я пытаюсь добавить «активный» класс к моей панели навигации начальной загрузки в MVC, но следующее не показывает активный класс, когда написано так:
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home", null, new {@class="active"})</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
Это разрешает то, что выглядит как правильно отформатированный класс, но не работает:
<a class="active" href="/">Home</a>
В документации Bootstrap говорится, что теги «a» не должны использоваться на панели навигации, но я считаю, что приведенное выше является правильным способом добавления класса в Html.ActionLink. Есть ли другой (аккуратный) способ сделать это?
asp.net
css
asp.net-mvc
twitter-bootstrap
Gillespie
источник
источник
active
класс кli
элементу, а не классa
. См. Первый пример здесь: getbootstrap.com/components/#navbarОтветы:
В Bootstrap
active
класс нужно применять к<li>
элементу, а не к классу<a>
. См. Первый пример здесь: http://getbootstrap.com/components/#navbarТо, как вы обрабатываете свой стиль пользовательского интерфейса в зависимости от того, что активно, а что нет, не имеет ничего общего с
ActionLink
помощником ASP.NET MVC . Это правильное решение, чтобы проследить за тем, как была построена платформа Bootstrap.Редактировать:
Поскольку вы, скорее всего, будете повторно использовать свое меню на нескольких страницах, было бы разумно иметь способ автоматически применять этот выбранный класс на основе текущей страницы, а не копировать меню несколько раз и делать это вручную.
Самый простой способ это просто использовать значение , содержащимися в
ViewContext.RouteData
, а именноAction
иController
ценности. Мы могли бы использовать то, что у вас есть сейчас, примерно так:Это не очень красиво в коде, но он выполнит свою работу и позволит вам извлечь ваше меню в частичное представление, если хотите. Есть способы сделать это более чистым способом, но, поскольку вы только начинаете, я оставлю все как есть. Удачи в изучении ASP.NET MVC!
Позднее редактирование:
Этот вопрос, похоже, набирает обороты, поэтому я решил использовать более элегантное решение с использованием
HtmlHelper
расширения.Изменить 24.03.2015: пришлось переписать этот метод, чтобы разрешить множественные действия и контроллеры, запускающие выбранное поведение, а также обработку, когда метод вызывается из частичного представления дочернего действия, думал, что поделюсь обновлением!
Работает с .NET Core:
Пример использования:
источник
Расширение:
Использование:
источник
role="presentation"
, что совсем не подходит для основного навигационного меню ( john.foliot.ca/aria-hidden/#pr ). Неупорядоченный список является подходящим контейнером для связанного набора ссылок, поскольку он логически группирует их вместе.var str = String.Format("<li role=\"presentation\"{0}>{1}</li>", currentAction.toLower().Equals(action.toLower(), StringComparison.InvariantCulture) && currentController.toLower().Equals(controller.toLower(), StringComparison.InvariantCulture) ? " class=\"active\"" : String.Empty, html.ActionLink(text, action, controller).ToHtmlString() );
Мне удалось это сделать, добавив параметр view bag в asp.net mvc. Вот что я наделал
Добавлен
ViewBag.Current = "Scheduler";
параметр Like на каждой страницеНа странице макета
Это решило мою проблему.
источник
Может быть немного поздно. Но надеюсь, что это поможет.
И использование следующим образом:
Получил ссылку с http://www.codingeverything.com/2014/05/mvcbootstrapactivenavbar.html
источник
Я знаю, что это старый вопрос, но я просто хочу добавить сюда свой голос. Я считаю, что это хорошая идея - оставить информацию о том, активна ли ссылка, контроллеру представления.
Я бы просто установил уникальное значение для каждого представления в действии контроллера. Например, если бы я хотел сделать ссылку на домашнюю страницу активной, я бы сделал что-то вроде этого:
Тогда, на мой взгляд, я напишу примерно так:
Когда вы переходите на другую страницу, скажем «Программы», ViewBag.Home не существует (вместо этого существует ViewBag.Programs); следовательно, ничего не отображается, даже class = "". Я думаю, что это чище и по ремонтопригодности, и по чистоте. Я всегда стараюсь исключить логику из поля зрения насколько это возможно.
источник
Учитывая то, что опубликовал Дамит, мне нравится думать, что вы можете просто квалифицироваться как активный с помощью Viewbag.Title (лучше всего заполнить его на своих страницах с контентом, чтобы ваша
_Layout.cshtml
страница содержала ваши панели ссылок). Также обратите внимание, что если вы используете элементы подменю, он также отлично работает:источник
Я изменил ответ dom «не очень» и сделал его более уродливым. Иногда два контроллера имеют конфликтующие имена действий (например, индекс), поэтому я делаю следующее:
источник
Вы можете попробовать это: в моем случае я загружаю меню из базы данных на основе доступа на основе ролей, напишите код в каждом своем представлении, какое меню вы хотите активировать на основе вашего представления.
источник
Это простое решение для Asp.net MCV 5.
Например, создайте статический класс
Utilitarios.cs
.Внутри класса создайте статический метод:
позвони так
источник
ASP.NET Core и Bootstrap 4
Самый последний ответ
Я переработал аккуратное решение @crush для обновленного, совместимого с ASP.NET Core и Bootstrap 4 способа решения этой проблемы на основе
IHtmlHelper
метода расширения:использование
источник
ActiveActionLink()
будет применен активный класс к<li>
:-)Easy ASP.NET Core 3.0 и TagHelpers
Включите в свой _ViewImports.cs:
Использование:
источник
Добавьте '.ToString', чтобы улучшить сравнение в ASP.NET MVC
-
источник
@functions { public bool IsActive(string action, string controller) { var actionRoute = ViewContext.RouteData.Values["Action"].ToString(); var controlRoute = ViewContext.RouteData.Values["Controller"].ToString(); return controller.Equals(controlRoute)&& actionRoute.Equals(actionRoute); } }
и использование:<li class="@(IsActive("Index", "Home")? "active": "")">
Мы также можем создавать
UrlHelper
из RequestContext, который мы можем получить из самого MvcHandler. Поэтому я верю, что тот, кто хочет сохранить эту логику в шаблонах Razor, будет полезен следующим образом:AppCode
.HtmlHelpers.cshtml
Создайте там помощника:
Затем мы можем использовать в наших представлениях вот так:
Надеюсь, что это кому-то поможет.
источник
UrlHelper
которая есть у васController.Url
. Единственное, что мы, вероятно, не хотим выполнять созданиеUrlHelper
для каждого вызова,MenuItem
поэтому мы можем применить отметку сохранения его в HttpContext Items после первого вызова помощника, чтобы мы делали это только один раз для каждого запроса.возможно с лямбда-функцией
затем использование
источник
Я создал
HtmlHelper
расширение, которое добавляетActiveActionLink
метод для тех из вас, кто хочет добавить «активный» класс к самой ссылке, а не к<li>
окружающему ссылку.Использование следующее:
источник
ответ @dombenoit работает. Хотя он вводит некоторый код для обслуживания. Проверьте этот синтаксис:
Обратите внимание на использование
.SetLinksActiveByControllerAndAction()
метода.Если вам интересно, что делает этот синтаксис возможным, посмотрите TwitterBootstrapMVC
источник
Я тоже искал решение, и jQuery мне очень помог. Во-первых, вам нужно присвоить своим
<li>
элементам идентификаторы .Сделав это на странице макета, вы можете указать jQuery, какой
<li>
элемент должен быть «выбран» в вашем представлении.Примечание: вам необходимо иметь
@RenderSection("scripts", required: false)
на своем макете страницу непосредственно перед</body>
тегом, чтобы добавить этот раздел.источник
Я хотел бы предложить это решение, основанное на первой части ответа Дома.
Сначала мы определяем две переменные, «действие» и «контроллер», и используем их для определения активной ссылки:
А потом:
Теперь это выглядит лучше и не требует более сложных решений.
источник
если он вообще не отображается, причина в том, что вам нужно два знака @:
НО, я считаю, что вам может понадобиться активный класс в теге «li», а не в теге «a». согласно слишком бутстраповские документы ( http://getbootstrap.com/components/#navbar-default ):
поэтому ваш код будет:
источник
Надеюсь, это поможет, вот каким может быть ваше меню:
И добавьте вспомогательную функцию MVC под тегом html.
Я сослался на ответ http://questionbox.in/add-active-class-menu-link-html-actionlink-asp-net-mvc/
источник
Я понял, что эта проблема - обычная проблема для некоторых из нас, поэтому я опубликовал собственное решение с использованием пакета nuget. Ниже вы можете увидеть, как это работает. Надеюсь, это будет полезно.
Примечание. Этот пакет nuget - мой первый пакет. Так что если вы заметили ошибку, оставьте отзыв. Спасибо.
Установите пакет или загрузите исходный код и добавьте свой проект
Добавьте свои страницы в перечисление
Поместите фильтр в верхнюю часть вашего Controllor или Action
И используйте его в макете заголовка, как это
Дополнительная информация: https://github.com/betalgo/MvcMenuNavigator
источник
Я считаю, что вот более чистый и компактный код, чтобы сделать выбранное меню «активным»:
источник
Я сделал комбинацию ответов выше и сделал свое решение.
Так..
Сначала в блоке razor создайте одну строковую переменную, которая будет содержать значение имени контроллера и действие, вызываемое пользователем.
Затем используйте комбинацию кода HTML и Razor:
Я думаю, что это хорошо, потому что вам не нужно каждый раз обращаться к «ViewContext.RouteData.Values», чтобы получить имя контроллера и имя действия.
источник
Мое решение этой проблемы
Лучшим способом может быть добавление метода расширения Html для возврата текущего пути для сравнения со ссылкой.
источник
Я сделал это:
Добавлен помощник в частичном представлении меню
Затем использовал его в теге привязки следующим образом:
В моем приложении не было областей, но его также можно включить в качестве другой переменной во вспомогательную функцию. И мне пришлось передать активный класс тегу привязки, на мой взгляд. Но
li
можно и так настроить.источник