Estou tentando adicionar uma classe "ativa" à minha barra de navegação de inicialização no MVC, mas o seguinte não mostra a classe ativa quando escrita assim:
<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>
Isso resolve o que parece uma classe formatada corretamente, mas não funciona:
<a class="active" href="/">Home</a>
Na documentação do Bootstrap, ele afirma que as tags 'a' não devem ser usadas na barra de navegação, mas acima é como acredito que seja a maneira correta de adicionar uma classe a um Html.ActionLink. Existe outra maneira (organizada) de fazer isso?
asp.net
css
asp.net-mvc
twitter-bootstrap
Gillespie
fonte
fonte
active
classe aoli
elemento, não oa
. Veja o primeiro exemplo aqui: getbootstrap.com/components/#navbarRespostas:
No Bootstrap, a
active
classe precisa ser aplicada ao<li>
elemento e não ao<a>
. Veja o primeiro exemplo aqui: http://getbootstrap.com/components/#navbarA maneira como você lida com o estilo da interface do usuário com base no que está ativo ou não tem nada a ver com o
ActionLink
assistente do ASP.NET MVC . Esta é a solução adequada para acompanhar como a estrutura do Bootstrap foi criada.Editar:
Como você provavelmente estará reutilizando seu menu em várias páginas, seria inteligente aplicar uma classe selecionada automaticamente com base na página atual, em vez de copiar o menu várias vezes e fazê-lo manualmente.
A maneira mais fácil é usar apenas os valores contidos em
ViewContext.RouteData
, ou seja, osAction
eController
valores. Podemos desenvolver o que você tem atualmente com algo assim:Não é bonito no código, mas fará o trabalho e permitirá que você extraia seu menu em uma exibição parcial, se quiser. Existem maneiras de fazer isso de uma maneira muito mais limpa, mas como você está apenas começando, deixarei por isso. Boa sorte ao aprender o ASP.NET MVC!
Edição tardia:
Esta questão parece estar recebendo um pouco de tráfego, então imaginei que lançaria uma solução mais elegante usando uma
HtmlHelper
extensão.Editar 24-03-2015: tive que reescrever esse método para permitir várias ações e controladores acionando o comportamento selecionado, além de lidar com quando o método é chamado a partir de uma exibição parcial de ação filho, pensei em compartilhar a atualização!
Funciona com o .NET Core:
Uso da amostra:
fonte
Extensão:
Uso:
fonte
role="presentation"
, que não é de todo apropriado para um menu de navegação principal ( john.foliot.ca/aria-hidden/#pr ). Uma lista não ordenada é muito um contêiner apropriado para um conjunto de links relacionados, pois os agrupa de maneira lógica.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() );
Eu consegui fazer isso adicionando um parâmetro view bag no asp.net mvc. Aqui o que eu fiz
Adicionado
ViewBag.Current = "Scheduler";
como parâmetro em cada páginaPágina de layout
Isso resolveu meu problema.
fonte
Pode ser um pouco tarde. Mas espero que isso ajude.
E uso como segue:
Obteve referência em http://www.codingeverything.com/2014/05/mvcbootstrapactivenavbar.html
fonte
Sei que essa pergunta é antiga, mas gostaria de adicionar minha voz aqui. Acredito que é uma boa idéia deixar o conhecimento de se um link está ou não ativo para o controlador da exibição.
Eu apenas definiria um valor exclusivo para cada visualização na ação do controlador. Por exemplo, se eu quisesse ativar o link da página inicial, faria algo assim:
Então, na minha opinião, vou escrever algo assim:
Quando você navega para uma página diferente, diga Programas, o ViewBag.Home não existe (em vez disso, o ViewBag.Programs existe); portanto, nada é renderizado, nem mesmo class = "". Eu acho que isso é mais limpo, tanto para manutenção quanto para limpeza. Costumo sempre querer deixar a lógica fora da vista o máximo que posso.
fonte
Considerando o que Damith postou, gosto de pensar que você pode se qualificar ativo pelo Viewbag.Title (a melhor prática é preencher isso nas suas páginas de conteúdo, permitindo que sua
_Layout.cshtml
página mantenha suas barras de links). Observe também que se você estiver usando itens de submenu , também funcionará bem:fonte
I modificada do dom resposta "não é bonito" e tornou mais feia. Às vezes, dois controladores têm os nomes de ações conflitantes (ou seja, Índice), então eu faço isso:
fonte
Você pode tentar o seguinte: No meu caso, estou carregando o menu do banco de dados com base no acesso baseado em funções, escreva o código em todas as visualizações no menu em que deseja ativar com base na visualização.
fonte
Esta solução é simples para o Asp.net MCV 5.
Crie uma classe estática, por exemplo
Utilitarios.cs
.Dentro da classe, crie um método estático:
ligue assim
fonte
ASP.NET Core e Bootstrap 4
Resposta mais atualizada
Eu refiz a solução elegante do @crush para obter uma maneira atualizada, compatível com o ASP.NET Core e o Bootstrap 4 , para resolver esse problema com base em um
IHtmlHelper
método de extensão:Uso
fonte
ActiveActionLink()
será aplicada a classe ativa para a<li>
:-)Fácil ASP.NET Core 3.0 e TagHelpers
Inclua no seu _ViewImports.cs:
Uso:
fonte
Adicione '.ToString' para melhorar a comparação no ASP.NET MVC
-
fonte
@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); } }
e uso:<li class="@(IsActive("Index", "Home")? "active": "")">
Também podemos criar a
UrlHelper
partir do RequestContext, que podemos obter do próprio MvcHandler. Portanto, acredito que alguém que queira manter essa lógica nos modelos do Razor da seguinte maneira seria útil:AppCode
.HtmlHelpers.cshtml
Crie um ajudante lá:
Então podemos usar nossos pontos de vista como este:
Espero que ajude alguém.
fonte
UrlHelper
que você possuiController.Url
. A única coisa é que provavelmente não queremos executar a criaçãoUrlHelper
para cada chamada,MenuItem
portanto, podemos aplicar uma marcação para salvá-la nos itens HttpContext após a primeira chamada ao auxiliar, para fazer isso apenas uma vez por solicitação.é possível com uma função lambda
então uso
fonte
Criei uma
HtmlHelper
extensão que adiciona umActiveActionLink
método para aqueles que desejam adicionar a classe "ativa" ao próprio link, em vez de<li>
envolvê-lo.O uso é o seguinte:
fonte
a resposta por @dombenoit funciona. Embora ele introduz algum código para manter. Confira esta sintaxe:
Observe o uso do
.SetLinksActiveByControllerAndAction()
métodoSe você se pergunta o que torna essa sintaxe possível, confira o TwitterBootstrapMVC
fonte
Eu também estava procurando uma solução e o jQuery ajudou bastante. Primeiro, você precisa dar 'id's aos seus
<li>
elementos.Depois de fazer isso na sua página de layout, você pode dizer ao jQuery qual
<li>
elemento deve ser 'selecionado' na sua exibição.Nota: Você precisa ter
@RenderSection("scripts", required: false)
em sua página de layout, um pouco antes da</body>
tag para adicionar essa seção.fonte
Gostaria de propor esta solução que se baseia na primeira parte da resposta de Dom.
Primeiro, definimos duas variáveis, "ação" e "controlador" e as usamos para determinar o link ativo:
E depois:
Agora parece mais agradável e não há necessidade de soluções mais complexas.
fonte
se não estiver sendo exibido, o motivo é que você precisa de dois sinais @:
MAS, acredito que talvez você precise ter a classe ativa na marca "li" e não na marca "a". de acordo com os documentos de inicialização ( http://getbootstrap.com/components/#navbar-default ):
portanto, seu código será:
fonte
Espero que isso ajude, abaixo está como seu menu pode ser:
E adicione a função auxiliar MVC abaixo da tag html.
Consultei a resposta em http://questionbox.in/add-active-class-menu-link-html-actionlink-asp-net-mvc/
fonte
Percebi que esse problema era um problema comum para alguns de nós, então publiquei minha própria solução usando o pacote nuget. Abaixo você pode ver como funciona. Espero que seja útil.
Nota: Este pacote de pepitas é o meu primeiro pacote. Portanto, se você encontrar um erro, envie um feedback. Obrigado.
Instale o pacote ou faça o download do código-fonte e adicione seu projeto
Adicione suas páginas a uma enumeração
Coloque o filtro no topo do seu controlador ou ação
E use-o no layout do cabeçalho como este
Mais informações: https://github.com/betalgo/MvcMenuNavigator
fonte
Eu acredito que aqui está um código mais limpo e menor para obter o menu selecionado sendo "ativo":
fonte
Eu fiz a combinação das respostas acima e fiz a minha solução.
Assim..
Primeiro no bloco de barbear, crie uma variável de string que conterá o valor do nome do controlador e a ação que é chamada pelo usuário.
Em seguida, use a combinação de código HTML e Razor:
Eu acho que isso é bom porque você não precisa acessar "ViewContext.RouteData.Values" toda vez para obter o nome do controlador e o nome da ação.
fonte
Minha solução para este problema é
Uma maneira melhor pode ser adicionar um método de extensão Html para retornar o caminho atual a ser comparado com o link
fonte
Eu fiz isso:
Ajudou na exibição parcial do menu
Em seguida, usei-o na tag anchor assim:
Meu aplicativo não tinha áreas, mas também pode ser incluído como outra variável na função auxiliar. E eu tive que passar a classe ativa para a marca âncora na minha opinião. Mas
li
também pode ser configurado assim.fonte