Próbuję dodać „aktywną” klasę do mojego paska nawigacyjnego bootstrap w MVC, ale poniższe nie pokazują aktywnej klasy po napisaniu w ten sposób:
<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>
Powoduje to coś, co wygląda na poprawnie sformatowaną klasę, ale nie działa:
<a class="active" href="/">Home</a>
W dokumentacji Bootstrap stwierdza się, że znaczniki „a” nie powinny być używane na pasku nawigacyjnym, ale powyższe jest moim zdaniem prawidłowym sposobem dodawania klasy do Html.ActionLink. Czy jest inny (uporządkowany) sposób, w jaki mogę to zrobić?
asp.net
css
asp.net-mvc
twitter-bootstrap
Gillespie
źródło
źródło
active
klasę doli
elementu, a niea
. Zobacz pierwszy przykład tutaj: getbootstrap.com/components/#navbarOdpowiedzi:
W Bootstrap
active
klasę należy zastosować do<li>
elementu, a nie do<a>
. Zobacz pierwszy przykład tutaj: http://getbootstrap.com/components/#navbarSposób obsługi stylu interfejsu użytkownika na podstawie tego, co jest aktywne lub nie, nie ma nic wspólnego z
ActionLink
pomocnikiem ASP.NET MVC . Jest to właściwe rozwiązanie, aby śledzić sposób budowy frameworka Bootstrap.Edytować:
Ponieważ najprawdopodobniej będziesz ponownie używać menu na wielu stronach, rozsądnie byłoby mieć sposób na automatyczne zastosowanie tej wybranej klasy na podstawie bieżącej strony, zamiast wielokrotnego kopiowania menu i robienia tego ręcznie.
Najłatwiej jest po prostu użyć wartości zawartych w
ViewContext.RouteData
, a mianowicie wartościAction
iController
. Moglibyśmy zbudować na tym, co obecnie masz, w następujący sposób:Nie jest ładna w kodzie, ale wykona zadanie i pozwoli ci wyodrębnić menu do częściowego widoku, jeśli chcesz. Istnieją sposoby, aby to zrobić w znacznie czystszy sposób, ale skoro dopiero zaczynasz, zostawię to na tym. Powodzenia w nauce ASP.NET MVC!
Późna edycja:
Wydaje się, że to pytanie generuje trochę ruchu, więc pomyślałem, że dorzuciłem bardziej eleganckie rozwiązanie, używając
HtmlHelper
rozszerzenia.Edycja 24.03.2015: Musiałem przepisać tę metodę, aby umożliwić wiele akcji i kontrolerów wyzwalających wybrane zachowanie, a także obsługę wywołania metody z częściowego widoku akcji podrzędnej, pomyślałem, że udostępnię aktualizację!
Współpracuje z .NET Core:
Przykładowe użycie:
źródło
Rozbudowa:
Stosowanie:
źródło
role="presentation"
, która wcale nie jest odpowiednia dla podstawowego menu nawigacyjnego ( john.foliot.ca/aria-hidden/#pr ). Lista nieuporządkowana jest w dużym stopniu odpowiednim kontenerem dla powiązanego zestawu linków, ponieważ grupuje je razem w logiczny sposób.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() );
Udało mi się to zrobić, dodając parametr widoku worka w asp.net mvc. Oto co zrobiłem
Dodano
ViewBag.Current = "Scheduler";
parametr podobny na każdej stronieNa stronie układu
To rozwiązało mój problem.
źródło
Może się trochę spóźnić. Ale mam nadzieję, że to pomoże.
I użycie w następujący sposób:
Mam odniesienie z http://www.codingeverything.com/2014/05/mvcbootstrapactivenavbar.html
źródło
Wiem, że to stare pytanie, ale chciałbym tylko dodać tutaj swój głos. Uważam, że dobrym pomysłem jest pozostawienie wiedzy o tym, czy łącze jest aktywne, czy nie, kontrolerowi widoku.
Po prostu ustawiłbym unikalną wartość dla każdego widoku w akcji kontrolera. Na przykład, gdybym chciał, aby link do strony głównej był aktywny, zrobiłbym coś takiego:
Wtedy moim zdaniem napiszę coś takiego:
Kiedy przejdziesz do innej strony, powiedz Programy, ViewBag.Home nie istnieje (zamiast tego ViewBag.Programs); dlatego nic nie jest renderowane, nawet class = "". Myślę, że jest to czystsze zarówno pod względem konserwacji, jak i czystości. Zawsze staram się nie zwracać uwagi na logikę tak bardzo, jak tylko mogę.
źródło
Biorąc pod uwagę to, co opublikował Damith, lubię myśleć, że możesz zakwalifikować się jako aktywny przez Viewbag.Title (najlepszą praktyką jest umieszczenie tego na stronach z treścią, co pozwoli Twojej
_Layout.cshtml
stronie na przechowywanie pasków linków). Pamiętaj również, że jeśli używasz elementów podmenu, to również działa dobrze:źródło
Zmodyfikowałem odpowiedź „nie ładna” dom i uczyniłem ją brzydszą. Czasami dwa kontrolery mają sprzeczne nazwy akcji (np. Indeks), więc robię to:
źródło
Możesz spróbować tego: w moim przypadku ładuję menu z bazy danych w oparciu o dostęp oparty na rolach, napisz kod w każdym widoku, które menu chcesz aktywować na podstawie swojego widoku.
źródło
To rozwiązanie jest proste w przypadku Asp.net MCV 5.
Utwórz na przykład klasę statyczną
Utilitarios.cs
.Wewnątrz klasy utwórz metodę statyczną:
zadzwoń w ten sposób
źródło
ASP.NET Core i Bootstrap 4
Najbardziej aktualna odpowiedź
Mam ponownego pracował @crush „s schludny rozwiązanie dla zaktualizowanej, ASP.NET podstawowej i Bootstrap 4 kompatybilnym sposobem rozwiązania tego problemu w oparciu o
IHtmlHelper
metodę rozszerzenia:Stosowanie
źródło
ActiveActionLink()
aktywna klasa zostanie skierowana do<li>
:-)Łatwy ASP.NET Core 3.0 i TagHelpers
Uwzględnij w swoim _ViewImports.cs:
Stosowanie:
źródło
Dodaj „.ToString”, aby usprawnić porównywanie w ASP.NET MVC
-
źródło
@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); } }
i użycie:<li class="@(IsActive("Index", "Home")? "active": "")">
Możemy również tworzyć
UrlHelper
z RequestContext, które możemy pobrać z samego MvcHandler. Dlatego wierzę, że ktoś, kto chce zachować tę logikę w szablonach Razor, byłby pomocny:AppCode
.HtmlHelpers.cshtml
Utwórz pomocnika w tym miejscu:
Następnie możemy użyć na naszych widokach w następujący sposób:
Mam nadzieję, że komuś to pomoże.
źródło
UrlHelper
, którą maszController.Url
. Jedyną rzeczą jest to, że prawdopodobnie nie chcemy wykonywać tworzeniaUrlHelper
dla każdego wywołania,MenuItem
więc możemy zastosować tick zapisania go w HttpContext Items po pierwszym wywołaniu helpera, więc robimy to tylko raz na żądanie.jest możliwe dzięki funkcji lambda
następnie użycie
źródło
Stworzyłem
HtmlHelper
rozszerzenie, które dodajeActiveActionLink
metodę dla tych z Was, którzy chcą dodać „aktywną” klasę do samego łącza, a nie do<li>
otaczającego go łącza.Sposób użycia jest następujący:
źródło
odpowiedź od @dombenoit działa. Chociaż wprowadza pewien kod do utrzymania. Sprawdź tę składnię:
Zwróć uwagę na użycie
.SetLinksActiveByControllerAndAction()
metody.Jeśli zastanawiasz się, co sprawia, że ta składnia jest możliwa, sprawdź TwitterBootstrapMVC
źródło
Szukałem też rozwiązania, a jQuery bardzo mi pomogło. Najpierw musisz podać identyfikatory swoim
<li>
elementom.Po wykonaniu tej czynności na swojej stronie układu możesz powiedzieć jQuery, który
<li>
element powinien być „wybrany” w Twoim widoku.Uwaga: aby dodać tę sekcję, musisz mieć
@RenderSection("scripts", required: false)
na swojej stronie układu, tuż przed</body>
tagiem.źródło
Chciałbym zaproponować takie rozwiązanie, które jest oparte na pierwszej części odpowiedzi Doma.
Najpierw definiujemy dwie zmienne, „akcja” i „kontroler”, i używamy ich do określenia aktywnego łącza:
I wtedy:
Teraz wygląda ładniej i nie ma potrzeby stosowania bardziej skomplikowanych rozwiązań.
źródło
jeśli w ogóle się nie wyświetla, powodem jest to, że potrzebujesz dwóch znaków @:
ALE wydaje mi się, że możesz potrzebować aktywnej klasy w tagu „li”, a nie w tagu „a”. zgodnie z dokumentacją bootstrap ( http://getbootstrap.com/components/#navbar-default ):
dlatego twój kod będzie wyglądał następująco:
źródło
Mam nadzieję, że to pomoże. Poniżej przedstawiamy, jak może wyglądać Twoje menu:
I dodaj poniżej funkcję pomocniczą MVC poniżej tagu html.
Skierowałem odpowiedź z http://questionbox.in/add-active-class-menu-link-html-actionlink-asp-net-mvc/
źródło
Zdałem sobie sprawę, że ten problem był częstym problemem dla niektórych z nas, więc opublikowałem własne rozwiązanie przy użyciu pakietu nuget. Poniżej możesz zobaczyć, jak to działa. Mam nadzieję, że to się przyda.
Uwaga: ten pakiet NuGet jest moim pierwszym pakietem. Jeśli więc zauważysz błąd, prześlij opinię. Dziękuję Ci.
Zainstaluj pakiet lub pobierz kod źródłowy i dodaj swój projekt
Dodaj swoje strony do wyliczenia
Umieść filtr na górze kontrolera lub akcji
I użyj tego w swoim układzie nagłówka w ten sposób
Więcej informacji: https://github.com/betalgo/MvcMenuNavigator
źródło
Uważam, że jest to bardziej przejrzysty i mniejszy kod, dzięki któremu wybrane menu będzie „aktywne”:
źródło
Zrobiłem kombinację odpowiedzi powyżej i stworzyłem rozwiązanie.
Więc..
Najpierw w bloku maszynki do golenia utwórz jedną zmienną łańcuchową, która będzie zawierała nazwę, wartość kontrolera i akcję wywoływaną przez użytkownika.
Następnie użyj kombinacji kodu HTML i Razor:
Myślę, że jest to dobre, ponieważ nie trzeba za każdym razem uzyskiwać dostępu do „ViewContext.RouteData.Values”, aby uzyskać nazwę kontrolera i nazwę akcji.
źródło
Moje rozwiązanie tego problemu to
Lepszym sposobem może być dodanie metody rozszerzenia HTML w celu zwrócenia bieżącej ścieżki do porównania z łączem
źródło
Ja to zrobiłem:
Stworzono pomocnika w częściowym widoku menu
Następnie użyłem go w tagu kotwicy w następujący sposób:
Moja aplikacja nie miała obszarów, ale można ją również uwzględnić jako inną zmienną w funkcji pomocnika. W moim widoku musiałem przekazać aktywną klasę do tagu kotwicy. Ale
li
można go również skonfigurować w ten sposób.źródło