2010-02-04 27 views
22

Sto sviluppando un'applicazione ASP.NET con C# e Ajax.Passare i dati da una pagina ASP.NET ai controlli utente ASCX caricati dinamicamente

Ho una pagina che contiene i controlli utente caricati dinamicamente. Devo passare alcuni dati (valori interi e alcune stringhe) al controllo utente che è stato caricato dinamicamente.

Ora uso Session per passare questi valori, ma penso di poter usare un altro modo; qualcosa come VIEWSTATE o input nascosto.

Cosa mi consigliate?

UPDATE:

Il fatto che carico il controllo è dinamicamente importante perché i controlli vengono caricati su ogni postback, e non posso memorizzare qualsiasi valore controlli.

risposta

39

Creare una proprietà sul controllo utente con il tipo di dati che si desidera passare ad esso e compilarlo nella pagina alla creazione del controllo.

public class myControl : Control 
{ 
    ... 
    public int myIntValue {get; set;} 
    ... 
} 

nel codice dietro:

myControl ctrl = new myControl(); 
ctrl.myIntValue = 5; 

È anche possibile farlo direttamente nel markup: proprietà

<uc1:myControl ID="uc1" runat="server" myIntValue="5" /> 
+0

questa è una grande risposta, ma non posso usarlo perché i controlli sono caricati dinamicamente. Forse userò campi nascosti. Grazie. – VansFannel

+2

È necessario utilizzare ViewState per mantenere lo stato del controllo. – Oded

+1

E come posso mantenere i valori delle proteste pubbliche su ViewState? Sto provando a farlo, ma myIntValue è sempre zero. – VansFannel

10

Setup pubblici all'interno del vostro controllo utente.

public string TestValue { get;set;}; 

E poi quando si mette il controllo utente nella pagina aspx:

<uc1:UserControl ID="uc1" runat="server" TestValue="Testing" /> 

è anche possibile modificare i valori all'interno del vostro codice dietro:

uc1.testValue = "some value"; 
+0

Questa è un'ottima risposta, ma non posso usarla perché i controlli sono caricati dinamicamente. Forse userò campi nascosti. Grazie. – VansFannel

0

tipo di sconfitte lo scopo di usare un controllo ascx IMO poiché questo interrompe l'incapsulamento del controllo. La tua pagina dovrebbe essere -getting- dati dal controllo attraverso la sottoscrizione di eventi pubblicati dal controllo.

+0

Devo passare i dati da PAGINA a CONTROL. – VansFannel

+1

Come si interrompe l'incapsulamento? –

3

Per rispondere effettivamente al tuo quesiton, così come tutti gli altri non vogliono che tu lo faccia, e sono d'accordo ... Ho fatto questo genere di cose prima.

La prima cosa che farei è che la pagina implementi un'interfaccia.

Nel controllo:

IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage; if (provider != null) { //grab data from interface } else throw YouCantPutThisControlOnThisKindOfPageException();

non è il modo più elegante per farlo, ma quando abbiamo avuto un sacco di controlli che vogliono condividere un oggetto molto costoso questa misura la fattura.

Questo funziona bene, ma rende il controllo inutilizzabile su pagine che non implementano l'interfaccia - e ciò rende i controlli troppo strettamente accoppiati alla pagina. Tutti gli altri che dicono di avere i dati della pagina dai controlli sono corretti; metti i controlli sulla pagina, non le pagine nei controlli.

Si dovrebbe avere un buon motivo per farlo. Per noi: il carico dell'oggetto condiviso era molto costoso e avere la pagina caricata/salvata indipendentemente dal controllo su quell'oggetto era abbastanza utile.

Era un peccato che un sacco di pagine che non implementavano realmente l'interfaccia dovevano essere installate per fornire una sorta di supporto o supporto proxy solo per far funzionare i controlli, e reso le pagine e i controlli tanto meno riutilizzabile.

Se dovessi ricominciare da capo, avrei la pagina inviare i dati ai controlli con gli eventi, probabilmente attraverso la riflessione se dovessi essere pigro.

+0

E che ne è dell'utilizzo di proprietà pubbliche sui controlli utente? – VansFannel

+0

Questo funzionerebbe. Eventi o proprietà pubbliche sono praticamente le stesse * in termini di accoppiamento. * – Broam

+0

Mi dispiace, ma se carico i controlli dinamicamente non posso usare proprietà pubbliche. – VansFannel

0

è possibile impostare i valori nella raccolta HttpContext.Items e leggerli nei propri controlli. È come usare Session, tranne per il fatto che è disponibile solo per richiesta e non per tutta la durata della sessione.

http://www.4guysfromrolla.com/articles/060904-1.aspx

IMHO questo è un po 'pigro, ma potrebbe essere una buona soluzione in alcune situazioni.

Problemi correlati