2011-09-14 10 views
7

Ho un problema con il quale lo stato di visualizzazione di un ripetitore, ovvero i controlli all'interno del ripetitore, non stanno mantenendo il loro stato di visualizzazione.Manutenzione dello stato di vista di un ripetitore

Ho il seguente:

Ripetitore 1:

<asp:Repeater ID="rptImages" runat="server"> 
<ItemTemplate> 
    <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" /> 
</ItemTemplate> 
</asp:Repeater> 

Quando il pulsante link viene cliccato il valore del CommandArgument è memorizzato in un campo nascosto nella pagina.

Al momento del postback non è possibile ottenere il valore del campo nascosto finché non è stato caricato il gestore eventi del prerender. Così nel mio evento PreRender Afferro il valore del campo nascosto e conservarla in una proprietà List, in questo modo:

if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) { 
     this.ImageList.Add(this.SelectedImageIDsInput.Text); 
    } 

E la proprietà Elenco sembra in questo modo:

public List<string> ImageList { 
    get { 
     if (this.ViewState["ImageList"] == null) { 
      this.ViewState["ImageList"] = new List<string>(); 
     } 
     return (List<string>)(this.ViewState["ImageList"]); 
    } 
    set { this.ViewState["ImageString"] = value; } 
} 

Una volta che ho immagazzinato il valore nella mia proprietà nell'elenco I legare il mio secondo ripetitore (ancora una volta all'interno della manifestazione PreRender):

this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList; 
this.rptSelectedImages.DataBind(); 

il secondo ripetitore ha una DropDownList e una casella di testo all'interno di esso. Il problema è che il viewstate di questi controlli figlio non viene mantenuto. Presumo che sia perché con ogni postback sto riconciliando il ripetitore, quindi è ricostruito. Quello che non so è come posso aggirare questo? La proprietà ImageList viene aggiornata solo su un postback, quindi ovviamente devo riassociare il ripetitore con ogni postback - come altro si può fare?

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie Al

risposta

13

Se si rilegatura il ripetitore, è necessario farlo su Init prima della ViewState viene caricato.

È inoltre necessario controllare il flag IsPostback e collegare solo il ripetitore quando la pagina non viene posticipata.

Per chiarire se il secondo ripetitore è destinato a PreRender poi ViewState non possono essere utilizzati a persistere i controlli, perché semplicemente non esistono quando ViewState viene caricato - dopo Init, e prima PreLoad.

È necessario continuare a rilegare su ogni postback o memorizzare o elencare in Session in modo da poter accedere all'elenco per eseguire il binding una volta su Init, (o su modifica).

+0

Hi CodeKing. Due problemi però - non posso ottenere il valore del campo nascosto già dall'evento Init - più la proprietà ImageList può essere aggiornata solo sul postback ..... – higgsy

+0

In tal caso è necessario eseguire nuovamente il bind del secondo ripetitore su ogni chiamata che utilizza il valore nel campo nascosto. – TheCodeKing

+0

Hi CodeKing - questo è esattamente quello che sto facendo anche se non è vero? Sto fraintendendo la tua risposta. Al momento attendo fino a quando l'onprerender ottiene il valore del campo nascosto e poi re-associ il ripetitore - il problema con questo è il viewstate dei controlli nel ripetitore non persistere sui postback .... – higgsy

0

Non vedo il punto di copiare la proprietà CommandArgument in un campo nascosto. Quello che dovresti fare è utilizzare l'evento ItemCommand su Repeater e utilizzare il bubbling degli eventi. È possibile gestire l'evento Click su di voi LinkButton piace questo:

repeater.ItemCommand += (sender, eventArgs) => { 
    var commandArgument = eventArgs.CommandArguments; 
    ImageList.Add(commandArgument); 
    rptSelectedImages.DataSource = ImageList; 
    rptSelectedImages.DataBind(); 
} 
+0

Ciao Mikael - So che sembra folle copiarlo in un campo nascosto. Il problema è che ho anche un upload di immagini jQuery sulla stessa pagina - una volta che il file ha caricato il gestore restituisce il nuovo ImageId - ovviamente JS non può chiamare ImageList.Add quindi deve essere memorizzato in un campo nascosto. Ha senso? – higgsy

Problemi correlati