Control Web Menu, NavigateUrl y MenuItemClick
Hoy me he encontrado con uno de esos problemas muy viejos en ASP.NET y que no es menos importante por ser tan antiguo, sino por lo extraño del funcionamiento y su solución, sobre todo para el que empieza con ASP.NET, así como lo rápido que olvidamos a veces como resolver estas pequeñas piedras que aparecen en el camino con la consiguiente pérdida de tiempo.
Se trata de usar el control Menu (System.Web.UI.WebControls.Menu) dentro de una página maestra o no, y de detectar cuando el usuario hace clic en uno de los elementos del menú, es decir, utilizando el evento (Menu1_MenuItemClick).
Hasta aquí lo normal.
Para preparar nuestro menú, podemos crear una colección de elementos (propiedad Items del control Menu) o bien, haciéndolo dinámicamente utilizando para ello un elemento del menú [objeto MenuItem :: Dim menuElement As New MenuItem()] y agregando este elemento al control Menu [Me.Menu1.Items.Add(menuElement)].
Por supuesto, no solo debemos crear un MenuItem, sino que a este objeto le debemos dotar de propiedades y características que satisfagan nuestras necesidades para luego agregarlo al control Menu como hemos indicado anteriormente.
Una de esas propiedades que podríamos utilizar podría ser la propiedad NavigateUrl. Una propiedad que asocia al elemento del menú con una dirección Web determinada que es justamente lo que el sentido común pide. Otra propiedad de este control es la propiedad Text y Value. Text es la propiedad que contendrá el texto de la dirección Web, y Value un valor del elemento del menú. Al crear un elemento nuevo y cambiar la propiedad Text a través de la ventana de propiedades, la propiedad Value toma por defecto el mismo valor que Text.
Bien, y ahora el problema…
Al trabajar con páginas Web, a veces cometemos un error bastante grande, y es olvidar que el uso de NavigateUrl para controlar sobre qué elemento se ha hecho clic es inviable, es decir, el uso de NavigateUrl no lanzará el evento Menu1_MenuItemClick que es el evento que nos permite controlar sobre qué opción del menú hemos hecho clic y que es en esta entrada el objetivo a resolver.
La solución residiría en eliminar el valor de NavigateUrl, por lo que la pregunta directa que surge es…
Pregunta: ¿Y como controlo entonces a que dirección Web quiero enviar al usuario al hacer clic sobre una determinada opción del menú?.
Respuesta: Utilizando la propiedad Value.
Es decir, el menú tendría esta forma:
MenuItem 0
Text Página principal
Value Index.aspx
Ojo: NavigateUrl no tiene valor porque no le hemos asignado ninguno.
Pero claro, al hacer clic sobre la opción del menú, no nos redireccionará por arte de magia a Index.aspx, más que nada porque NavigateUrl vale «».
La solución de todo esto está en el evento Menu1_MenuItemClick que nos permitirá saber sobre qué opción ha hecho clic el usuario.
Para controlar esta situación podríamos escribir el siguiente código:
Protected Sub Menu1_MenuItemClick(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MenuEventArgs) Handles Menu1.MenuItemClick
Response.Redirect(e.Item.Value)
End Sub
Ahora bien, la pregunta que podría surgir es si la propiedad NavigateUrl se utiliza o no, etc.
Pues sí, claro que se utiliza, el tema está en que a veces, nuestra aplicación debe controlar sobre qué opción hace clic el usuario, algo que es más frecuente de lo que parece, y es ahí donde el uso de NavigateUrl no nos satisface porque no lanza el evento Menu1_MenuItemClick.
El motivo por el cual el control Menu no lanza el evento Menu1_MenuItemClick al utilizar NavigateUrl es debido a que al haber especificado un valor a NavigateUrl, el control ejecuta un proceso de navegación en lugar de un proceso de postback. Aquí está el quiz de todo. Al no hacer postback, no podemos rescatar el evento y por lo tanto no somos capaces de gestionar Menu1_MenuItemClick.
Por lo tanto, cuidado al utilizar el control Menu y poner contenido a la propiedad NavigateUrl o no, porque si queremos gestionar cuando un usuario hace clic sobre una opción del menú, podríamos encontrarnos con algún que otro problema.
7 Responsesso far
hola, yo quiero que la barra desplegable de mi menu no se despliegue sin antes darle clic (solo quiero eso!! XD), la url de yo lo jalo de la bd, agradeceria cualquier ayuda.
Muchas gracias!!! hace semanas que estoy luchando para que corra el evento itemclick y no podia. Mira que busque y busque y tu articulo es el unico que encontre… y en español!!!!
De nuevo muchas gracias.
Estimado amigo, por favor si puede cooperar con la informacion de como realizar un menu principal en asp.net.
gracias.
atte. javier quispe
me parece muy buena je!!!
Hola, como puedo llamar a una nueva pantalla cuando selecciono un elemento del menu, y que esta pantalla no lleve una barra de direcciones, esto es, para que el usuario no teclee otras pantallas
Hay alguna forma de que haciendo click sobre la solapa del menu desplegable me redireccione? porque solo redirecciona cuando hago click sobre el texto. Gracias!
tengo una intranet local y el menu horizontal al hacer click enciam no despliega nada sale todo en blanco asi de repente dejo de funcionar, a que se debe esto