Domanda

Ho un controllo Menu (derivato) che visualizza un elenco piuttosto ampio di elementi da un'origine dati personalizzata. Devo disabilitare ViewState nel menu per evitare la fastidiosa "quotazione Impossibile selezionare una voce di menu disabilitata o non selezionabile" quando un altro controllo fa cambiare la selezione corrente su un postback.

Sfortunatamente, quando ViewState è disabilitato per il Menu, i postback generati da da il menu non generano alcun evento. Se abilito ViewState, viene generato l'evento OnMenuItemClick. Se disabilito ViewState, OnMenuItemClick non viene generato. Sono perplesso.

Devo lasciare ViewState disattivato per il menu, quindi come posso gestire i postback dal menu attuale?

A questo punto mi sto orientando verso l'utilizzo dell'evento Load del menu, analizzando __EVENTTARGET per vedere se è il menu e andando da lì. Ciò avrebbe tecnicamente elaborato l'evento di postback prima che normalmente, ma va bene, immagino.

Qualche idea migliore?

È stato utile?

Soluzione 2

Ho capito l'essenza del problema. Usando Reflector possiamo vedere le parti importanti del metodo di basso livello che gestisce l'effettivo postback e quindi genera l'evento:

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

Come puoi vedere, MenuEventArgs ha un MenuItem. Se non è possibile trovarne uno nella raccolta Articoli corrente che corrisponda ai dati dei post in arrivo, l'evento non viene generato. Con ViewState disabilitato, nel menu non sono presenti elementi (sarebbero stati ricostruiti utilizzando ViewState). Quindi l'evento non verrà generato.

Per ovviare a questo, ho detto al menu di costruirsi da solo durante il caricamento usando i dati non ancora aggiornati (a questo punto sarà lo stesso che era alla fine dell'ultima richiesta). Questo è essenzialmente lo stesso di ricostruire il menu da ViewState, quindi non mi sento male per quanto riguarda le prestazioni, o altro. OnMenuItemClick viene quindi attivato come previsto. Infine, durante PreRender dico al Menu di ricostruire ancora una volta, in modo che rifletta le modifiche avvenute durante la fase di elaborazione del postback del ciclo di vita.

Ho perso molto tempo, quindi spero che queste informazioni possano aiutare qualcun altro in una situazione simile.

Altri suggerimenti

Sì, puoi scegliere, o utilizzare viewstate per ripopolare un controllo associato oppure puoi collegarlo a un database prima che gli eventi vengano generati (Page_Load va bene).

Non necessariamente lo rileggerei sempre di nuovo in Page_PreRender, se nulla è cambiato in questo postback (i cambiamenti sono avvenuti altrove nella pagina), non c'è motivo di vincolarlo di nuovo.

Invece potresti essere in grado di legare solo a determinati eventi quando sai che dovrà cambiare.

In Page_Load ricollega il controllo a sitemapdata e controlla se IsPostBack.

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

questo lavoro per me e ridurre il viewstate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top