Domanda

Ho un controllo utente che utilizza il paradigma standard if (! IsPostBack) {// inizializza me stesso per evitare di ripetere l'inizializzazione durante i postback (quindi, scambiando meno hit DB per un uso maggiore di ViewState ). Questo approccio mi è utile per la maggior parte del tempo, ma c'è un posto in cui voglio aggiungere questo controllo alla gerarchia dei controlli "in ritardo", durante un postback.

Questo, ovviamente, causa il fallimento della logica di inizializzazione e il rendering del controllo in uno stato non inizializzato.

Quale protezione dovrei usare per determinare se devo inizializzare, poiché ! IsPostBack non lo sta tagliando? Potrei impostare un flag durante LoadViewState , ma sembra un po 'hacker. Quello che mi piacerebbe trovare è una condizione che si verifica solo quando un controllo viene aggiunto per la prima volta alla gerarchia dei controlli, e la chiave su quello. Esiste una condizione del genere?

[modifica] Segue lo pseudocodice di esempio per la pagina contenente:

protected void Page_Prerender(object sender, EventArgs e)
{
    Controls.Add(LoadControl("some_control.ascx"));
}

C'è un modo per some_control di sapere che è stato aggiunto in ritardo?

È stato utile?

Soluzione 4

Ulteriori ricerche non mi hanno portato a una soluzione generale a questo problema. Quello che alla fine ho fatto è stato impostare un flag in Page_LoadViewState che ha soppresso l'inizializzazione del controllo - effettivamente la stessa cosa che proteggere l'inizializzazione con ! IsPostBack , ma un po 'più preciso.

Altri suggerimenti

Non puoi usare il costruttore per inizializzare i controlli figlio? (o crea un metodo Initialize) Quindi controlli quando il controllo viene inizializzato.

Forse questo ti aiuterà a capire il tuo problema: “… Cosa succede se un controllo viene creato in un gestore eventi e aggiunto dinamicamente all'albero di controllo? In tal caso, il controllo riproduce il recupero. Non appena viene aggiunto all'albero di controllo, inizia a eseguire le sue fasi fino a raggiungere la fase corrente della pagina ... "

Maggiori informazioni qui:

http://weblogs.asp.net/vga /archive/2003/08/11/23498.aspx

Non esiste davvero il concetto di aggiungere un controllo per il "primo" tempo, perché ricorda che ogni volta che richiedi una pagina, viene creato un nuovo oggetto pagina, con tutte le nuove istanze di controllo. Le istanze di controllo create in precedenza non vengono aggiunte al nuovo oggetto pagina.

Perché la logica di inizializzazione fallisce? Forse se hai pubblicato quel codice potremmo suggerire qualcosa - non sembra che dovrebbe essere necessariamente così.

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