Pregunta

Tengo un control de menú (derivado), que muestra una lista bastante grande de elementos de un origen de datos personalizado. Necesito deshabilitar ViewState en el menú para evitar el muy molesto "No se puede seleccionar un elemento de menú deshabilitado o no seleccionable" cuando algún otro control hace que la selección actual cambie en una devolución de datos.

Desafortunadamente, cuando ViewState está deshabilitado para el Menú, las devoluciones generadas por el menú no generan eventos. Si habilito ViewState, se genera el evento OnMenuItemClick. Si deshabilito ViewState, OnMenuItemClick no se genera. Estoy perplejo.

Necesito dejar ViewState desactivado para el menú, así que, ¿cómo puedo manejar las devoluciones de datos desde el menú real?

En este punto, me estoy inclinando hacia el uso del evento de carga del menú, analizando el __EVENTTARGET para ver si es el menú y desde allí. Esto técnicamente procesaría el evento de devolución de datos antes de lo normal, pero supongo que está bien.

¿Alguna idea mejor?

¿Fue útil?

Solución 2

He descubierto la esencia del problema. Usando Reflector podemos ver las partes importantes del método de bajo nivel que maneja la devolución real y luego genera el evento:

string str = HttpUtility.HtmlDecode(eventArgument);
...
MenuItem item = this.Items.FindItem(str.Split(new char[] { '\\' }), 0);
if (item != null)
    this.OnMenuItemClick(new MenuEventArgs(item));

Como puede ver, se entrega un MenuItem a MenuEventArgs. Si no se puede encontrar uno en la colección de Elementos actual que coincida con los datos de entrada entrantes, entonces el evento no se genera. Con ViewState deshabilitado, el menú no tiene ningún elemento (se habrían reconstruido usando ViewState). Por lo tanto, el evento no se generará.

Para solucionar esto, le he dicho al menú que se construya durante la carga utilizando los datos no actualizados (en este punto, será el mismo que al final de la última solicitud). Esto es esencialmente lo mismo que reconstruir el menú desde ViewState, por lo que no me siento mal con respecto al rendimiento, o lo que sea. OnMenuItemClick se dispara como se esperaba. Por último, durante PreRender, le digo al Menú que reconstruya una vez más, para que refleje los cambios que ocurrieron durante la parte del procesamiento de devolución de datos del ciclo de vida.

Perdí mucho tiempo en esto, así que espero que esta información pueda ayudar a alguien más en una situación similar.

Otros consejos

Sí, puede elegir, use viewstate para volver a llenar un control enlazado o puede vincularlo antes de que se activen los eventos (Page_Load está bien).

No necesariamente siempre lo vincularía de nuevo en Page_PreRender, si nada ha cambiado en esta devolución de datos (los cambios ocurrieron en otra parte de la página), entonces no hay razón para volver a vincularlos.

En su lugar, es posible que solo pueda vincular ciertos eventos cuando sepa que tendrá que cambiar.

En Page_Load, vuelva a enlazar el control a sitemapdata y verifique si IsPostBack.

if (IsPostBack) {
            Menu.DataBind();
}

esto funciona para mí y reduce el estado de la vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top