2010-09-14 12 views
5

Ecco ciò che è nel mio code-behind:Mantenere elenco generico tra i postback

List<Event> events = new List<Event>(); 

protected void Page_Load(object sender, EventArgs e) 
{ 

} 

protected void AddEvent_Click(object sender, EventArgs e) 
{ 
    Event ev = new Event(); 

    ev.Name = txtName.Text; 

    events.Add(ev); 
} 

Voglio aggiungere un elemento alla lista ogni volta che il pulsante Aggiungi viene cliccato, ma l'elenco viene resettato dopo ogni postback . Come posso mantenere i dati nella lista tra i postback?

risposta

8

Mi capita spesso di utilizzare una tecnica di questo tipo, anche se tenere a mente questo può causare il ViewState (come reso al browser) a crescere piuttosto grande:

public List<Event> Events 
{ 
    get { return (List<Event>)ViewState["EventsList"]; } 
    set { ViewState["EventsList"] = value; } 
} 

Poi, quando si desidera utilizzare la lista che si avrebbe fatto qualcosa di simile:

public void AddToList() 
{ 
    List<Event> events = Events; // Get it out of the viewstate 
    ... Add/Remove items here ... 
    Events = events; // Add the updated list back into the viewstate 
} 

si noti inoltre che la classe di evento dovrà essere serializzabile, ma che di solito è semplice come aggiungere l'attributo [Serializable] per la classe (a meno che la sua una classe molto complesso).

+1

Non è necessario assegnare l'elenco degli eventi alla proprietà Events, si lavora con i riferimenti. È la stessa lista. –

+0

@Alex Reibort: Effettivamente, nel getter stai de-serializzando l'istanza della lista fuori dallo stato di visualizzazione, nel setter stai serializzando nuovamente l'istanza nello stato di visualizzazione. L'istanza nel codice è la stessa, ma quella scompare tra i postback, è necessario aggiornare lo stato della vista dopo che è stata modificata. – CodingGorilla

+0

No, non lo fai. ViewState detiene deserializza il suo modo di contenuti prima di chiedere l'elenco, quindi mantiene il riferimento alla lista quando ci si accede, si ottiene il riferimento, lo si usa per aggiornare l'istanza e verrà automaticamente salvato in viewstate. Provalo e basta –

1

Avrete bisogno di mantenere la lista da soli in qualche modo. Puoi inserirla in ViewState, inserirla nel database, archiviarla nella Session, inserirla in un HiddenField nella pagina ...

+0

cosa? Elenca l'oggetto in un campo nascosto? – JoshYates1980

1

Salvare l'elenco in sessione o in viewstate.

protected void AddEvent_Click(object sender, EventArgs e) 
{ 
    Event ev = new Event(); 

    ev.Name = txtName.Text; 
    if(Session["events"] == null) 
    { 
     Session["events"] = new List<Event>(); 
    } 
    var events = (List<Event>)Session["events"]; 
    events.Add(ev); 
} 
0

Grazie CodingGorilla, questo ha risolto il mio problema. Ma devo aggiungere ancora una cosa per i nuovi arrivati.

List<Event> events = Events; // Get it out of the viewstate 
**You should check whether events is null** 
Events = events; // Add the updated list back into the viewstate 
Problemi correlati