Estoy tratando de agregar una clase "activa" a mi barra de navegación de arranque en MVC, pero lo siguiente no muestra la clase activa cuando se escribe así:
<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>
Esto resuelve lo que parece una clase formateada correctamente, pero no funciona:
<a class="active" href="/">Home</a>
En la documentación de Bootstrap dice que las etiquetas 'a' no deberían usarse en la barra de navegación, pero lo anterior es cómo creo que es la forma correcta de agregar una clase a un Html.ActionLink. ¿Hay otra forma (ordenada) de hacer esto?
asp.net
css
asp.net-mvc
twitter-bootstrap
Gillespie
fuente
fuente
active
clase alli
elemento, no ela
. Vea el primer ejemplo aquí: getbootstrap.com/components/#navbarRespuestas:
En Bootstrap, la
active
clase debe aplicarse al<li>
elemento y no al<a>
. Vea el primer ejemplo aquí: http://getbootstrap.com/components/#navbarLa forma en que maneja su estilo de UI en función de lo que está activo o no tiene nada que ver con el
ActionLink
asistente de ASP.NET MVC . Esta es la solución adecuada para seguir cómo se creó el marco Bootstrap.Editar:
Como lo más probable es que reutilice su menú en varias páginas, sería inteligente tener una manera de aplicar esa clase seleccionada automáticamente en función de la página actual en lugar de copiar el menú varias veces y hacerlo manualmente.
La forma más fácil es simplemente usar los valores contenidos
ViewContext.RouteData
, es decir, los valoresAction
yController
. Podríamos construir sobre lo que tiene actualmente con algo como esto:No es bonito en el código, pero hará el trabajo y le permitirá extraer su menú en una vista parcial si lo desea. Hay maneras de hacer esto de una manera mucho más limpia, pero como recién está comenzando, lo dejaré así. ¡Mucha suerte aprendiendo ASP.NET MVC!
Edición tardía:
Esta pregunta parece estar obteniendo un poco de tráfico, así que pensé que agregaría una solución más elegante usando una
HtmlHelper
extensión.Editar 24/03/2015: Tuve que reescribir este método para permitir que múltiples acciones y controladores desencadenaran el comportamiento seleccionado, así como el manejo cuando se llama al método desde una vista parcial de acción secundaria, ¡pensé que compartiría la actualización!
Funciona con .NET Core:
Uso de la muestra:
fuente
Extensión:
Uso:
fuente
role="presentation"
, que no es del todo apropiado para un menú de navegación principal ( john.foliot.ca/aria-hidden/#pr ). Una lista desordenada es en gran medida un contenedor apropiado para un conjunto relacionado de enlaces, ya que los agrupa de una manera 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() );
Logré hacer esto agregando un parámetro de vista de bolsa en asp.net mvc. Aqui que he hecho
Agregado
ViewBag.Current = "Scheduler";
como parámetro en cada páginaEn la página de diseño
Esto resolvió mi problema.
fuente
Puede llegar un poco tarde. Pero espero que esto ayude.
Y uso de la siguiente manera:
Obtuve referencia de http://www.codingeverything.com/2014/05/mvcbootstrapactivenavbar.html
fuente
Sé que esta pregunta es antigua, pero me gustaría agregar mi voz aquí. Creo que es una buena idea dejar el conocimiento de si un enlace está activo o no al controlador de la vista.
Simplemente establecería un valor único para cada vista en la acción del controlador. Por ejemplo, si quisiera activar el enlace de la página de inicio, haría algo como esto:
Luego, en mi opinión, escribiré algo como esto:
Cuando navega a una página diferente, diga Programas, ViewBag.Home no existe (en cambio ViewBag.Programs sí); por lo tanto, no se muestra nada, ni siquiera class = "". Creo que esto es más limpio tanto para la mantenibilidad como para la limpieza. Siempre tiendo a dejar la lógica fuera de la vista tanto como puedo.
fuente
Teniendo en cuenta lo que Damith publicó, me gusta pensar que solo puede calificar como activo por el Viewbag.Title (la mejor práctica es completar esto en sus páginas de contenido permitiendo que su
_Layout.cshtml
página mantenga sus barras de enlaces). También tenga en cuenta que si está utilizando elementos de submenú también funciona bien:fuente
He modificado de Dom respuesta "no es bonito" y lo hizo más feo. A veces, dos controladores tienen los nombres de acción en conflicto (es decir, Índice), así que hago esto:
fuente
Puede intentar esto: en mi caso, estoy cargando el menú de la base de datos basado en el acceso basado en roles, escriba el código en cada vista, qué menú desea activar en función de su vista.
fuente
Esta solución es simple para Asp.net MCV 5.
Crea una clase estática, por ejemplo
Utilitarios.cs
.Dentro de la clase crea un método estático:
llama así
fuente
ASP.NET Core y Bootstrap 4
La respuesta más actualizada
He reelaborado la solución ordenada de @crush para una forma actualizada, compatible con ASP.NET Core y Bootstrap 4 para resolver este problema basado en un
IHtmlHelper
método de extensión:Uso
fuente
ActiveActionLink()
se aplicará la clase activa a<li>
:-)Fácil ASP.NET Core 3.0 y TagHelpers
Incluir en su _ViewImports.cs:
Uso:
fuente
Agregue '.ToString' para mejorar la comparación en ASP.NET MVC
-
fuente
@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); } }
y uso:<li class="@(IsActive("Index", "Home")? "active": "")">
También podemos crear
UrlHelper
desde RequestContext que podemos obtener de MvcHandler. Por lo tanto, creo que alguien que quiera mantener esta lógica en las plantillas de Razor de la siguiente manera sería útil:AppCode
.HtmlHelpers.cshtml
Crea un ayudante allí:
Entonces podemos usar en nuestras vistas así:
Espero que ayude a alguien.
fuente
UrlHelper
que tienesController.Url
. Lo único es que probablemente no deseamos ejecutar la creaciónUrlHelper
para cada llamada, porMenuItem
lo que podemos aplicar una marca de guardarlo en Elementos HttpContext después de la primera llamada al ayudante, por lo que lo hacemos solo una vez por solicitud.es posible con una función lambda
luego uso
fuente
Creé una
HtmlHelper
extensión que agrega unActiveActionLink
método para aquellos de ustedes que desean agregar la clase "activa" al enlace en sí en lugar del enlace que lo<li>
rodea.El uso es el siguiente:
fuente
la respuesta de @dombenoit funciona. Aunque introduce algún código para mantener. Mira esta sintaxis:
Observe el uso de
.SetLinksActiveByControllerAndAction()
método.Si se pregunta qué hace posible esta sintaxis, consulte TwitterBootstrapMVC
fuente
También estaba buscando una solución y jQuery me ayudó bastante. Primero, necesitas dar 'id' a tus
<li>
elementos.Después de hacer esto en su página de diseño, puede decirle a jQuery qué
<li>
elemento debe 'seleccionarse' en su vista.Nota: debe tener
@RenderSection("scripts", required: false)
en su página de diseño, justo antes de la</body>
etiqueta para agregar esa sección.fuente
Me gustaría proponer esta solución que se basa en la primera parte de la respuesta de Dom.
Primero definimos dos variables, "acción" y "controlador" y las usamos para determinar el enlace activo:
Y entonces:
Ahora se ve mejor y no necesita soluciones más complejas.
fuente
si es que no se muestra en absoluto, la razón es que necesita dos signos @:
PERO, creo que es posible que necesite tener la clase activa en la etiqueta "li" y no en la etiqueta "a". de acuerdo con los documentos de bootstrap ( http://getbootstrap.com/components/#navbar-default ):
por lo tanto su código será:
fuente
Espero que esto ayude, a continuación se muestra cómo puede ser su menú:
Y agregue debajo la función auxiliar MVC debajo de la etiqueta html.
Remití la respuesta de http://questionbox.in/add-active-class-menu-link-html-actionlink-asp-net-mvc/
fuente
Me di cuenta de que este problema era un problema común para algunos de nosotros, así que publiqué mi propia solución usando el paquete nuget. A continuación puedes ver cómo funciona. Espero que sea de utilidad.
Nota: Este paquete nuget es mi primer paquete. Entonces, si ve un error, por favor envíe sus comentarios. Gracias.
Instale el paquete o descargue el código fuente y agregue su proyecto
Agregue sus páginas a una enumeración
Coloque el filtro en la parte superior de su Controllor o Acción
Y úsalo en tu diseño de encabezado como este
Más información: https://github.com/betalgo/MvcMenuNavigator
fuente
Creo que aquí hay un código más pequeño y limpio para hacer que el menú seleccionado esté "activo":
fuente
He hecho una combinación de las respuestas anteriores e hice mi solución.
Entonces..
Primero en el razor block cree una variable de cadena que contendrá el valor del nombre del controlador y la acción que llama el usuario.
Luego use la combinación de HTML y código Razor:
Creo que esto es bueno porque no necesita acceder a "ViewContext.RouteData.Values" cada vez para obtener el nombre del controlador y el nombre de la acción.
fuente
Mi solución a este problema es
Una mejor manera puede ser agregar un método de extensión Html para devolver la ruta actual a comparar con el enlace
fuente
Hice esto:
Hizo un ayudante en la vista parcial del menú
Luego lo usé en la etiqueta de anclaje de esta manera:
Mi aplicación no tenía áreas, pero también se puede incluir como otra variable en la función auxiliar. Y tuve que pasar la clase activa a la etiqueta de anclaje en mi opinión. Pero
li
también se puede configurar así.fuente