2009-07-24 22 views
21

L'unico modo in cui ho trovato di mantenere i valori delle proprietà all'interno di un controllo utente consiste nell'utilizzare ViewState.Controllo utente (ascx) e proprietà

public string Title { 
     get { return Convert.ToString(ViewState["Title"]); } 
     set { ViewState["Title"] = value; } 
    } 

Non posso dire che io sono reale impressionato con questo, però, come le altre proprietà di un controllo utente ha la più schifo sarai conficcato nella ViewState. C'è un modo migliore per mantenere le proprietà?

+3

Tutto I controlli Web lo fanno allo stesso modo, ecco perché ViewState diventa enorme ... –

+0

ho dovuto ricorrere a questo alla fine. È piuttosto frustrante come funziona, ma fa il lavoro .. beh per ora .. :) –

risposta

10

Dipende. Se è necessario mantenere i valori delle proprietà oltre un postback, sarà necessario utilizzare ViewState o Session. Dal momento che quei controlli vengono ricreati su ogni post non è possibile mantenere tale stato in altro modo.

+0

Sì, i valori delle proprietà devono persistere attraverso un postback. Ho un pulsante nel controllo utente che solleva il suo evento pulsante quando cliccato (duh), ed è in questo momento che ho bisogno di recuperare determinati valori di proprietà. Oh bene, suppongo che mi limiterò a gonfiare il ViewState! – Jagd

+1

"per essere persistito oltre un postback, allora dovrai usare ViewState o Session". Questo non è vero per ViewState. ViewState persiste solo tra post-back, non oltre. – dariom

-1

hai provato proprietà statiche? inoltre, ricorda che http è senza stato, quindi puoi semplicemente resettare il tuo titolo su ogni page_load

+2

Quindi cosa succede quando si hanno due richieste e entrambe desiderano utilizzare proprietà diverse sul controllo utente? –

2

Non è male - questo è esattamente il modo in cui funzionano i controlli integrati e in genere determinano un comportamento previsto. La cosa migliore è disabilitare in modo selettivo ViewState quando non è necessario mantenere questi valori attraverso i postback.

Si potrebbe anche voler controllare in ControlState - è un "sacchetto" separato che le persone non possono disabilitare, ed è usato per cose come GridView dove ci sono alcune cose che non è possibile disattivare tramite viewstate perché rompe il controllo.

5

Il tuo problema è esattamente ciò che ViewState è per: Per mantenere le proprietà di un controllo attraverso i postback, quindi la tua soluzione va bene.

È possibile salvarlo in sessione, ma questo è solo un peso per il server. A seconda del numero di utenti che hai, questo potrebbe diventare davvero brutto molto rapidamente.

Inoltre, tenere presente che è necessario eseguire alcune pulizie se si utilizza la sessione. Ad esempio, se si desidera utilizzare il controllo utente due volte nella stessa pagina, è necessario assicurarsi che ciascun controllo utilizzi variabili di sessione univoche.

8

Non c'è alcun problema con l'utilizzo di ViewState per memorizzare valori di proprietà per un controllo utente.

La tua affermazione "più proprietà di un controllo utente ha più schifezze che rimarrai nel ViewState" non è necessariamente vero però. È certamente possibile avere valori di traccia di proprietà ViewState per i controlli ma non memorizzare i dati nella variabile di campo modulo __VIEWSTATE nascosta.

Suoni pazzi, vero? Vedi TRULY Understanding ViewState per un brillante articolo su come funziona ViewState.

Dipende da quando si inizializzano le proprietà dei controlli nel suo ciclo di vita. ViewState verrà memorizzato solo nel campo __VIEWSTATE nascosto dopo il StateBag per un controllo inizia a tracciare le modifiche ai valori delle proprietà. Ciò si verifica nel metodo OnInit per un controllo che si trova all'inizio del ciclo di vita, ma esistono tecniche per impostare i valori delle proprietà in precedenza che non incorreranno nel costo di __VIEWSTATE bloat e continueranno a offrire tutti i vantaggi.

Vedere l'articolo collegato.Si discute tutto in modo molto chiaro e meglio di quanto io possa :-)

0

si può sempre ignorare le destinati SaveViewState/LoadViewState metodi:

public string Title { get; set; } 

E poi salvare e caricare come richiesto:

protected override object SaveViewState() 
{ 
    // Save State as a cumulative array of objects. 
    object baseState = base.SaveViewState(); 

    object[] allStates = new object[2]; 
    allStates[1] = _title; 
    return allStates; 
} 

protected override void LoadViewState(object savedState) 
{ 
    if (savedState != null) 
    { 
     // Load State from the array of objects that was saved during SavedViewState. 
     object[] myState = (object[])savedState; 
     if (myState[0] != null) 
     base.LoadViewState(myState[0]); 

     if (myState[1] != null) 
     _title = (String)myState[1]; 
    } 
} 
Problemi correlati