Domanda

Quali opzioni ho per la creazione di contenuti dinamici con stato in un sito Web ASP.Net?

Ecco il mio scenario. Ho un sito con più aree di contenuto nidificate. Il livello superiore sono le azioni legate a un'area funzionale Catalog , Abbonamenti , Settings .

Quando si fa clic sull'azione funzionale, voglio aggiungere dinamicamente contenuti specifici a quell'azione. Ad esempio, quando si fa clic su Catalogo, voglio visualizzare un albero con le cartelle del catalogo e amp; file e una regione a destra per i dettagli.

Quando un utente fa clic sull'albero, voglio che vengano caricati dettagli sensibili al contesto nell'area dei dettagli (come proprietà o opzioni per gestire i file).


Ho iniziato con UserControls . Hanno funzionato bene finché ho continuato a caricare tutto nella pagina e non ho mai lasciato scomparire. Non appena uno è scomparso, ViewState per la pagina è esploso perché l'albero di stato della vista non era valido.

(Non volevo continuare a caricare roba nella mia pagina perché non volevo che le risposte fossero troppo grandi)

Quindi, il mio prossimo approccio è stato quello di sostituire le mie regioni dinamiche con IFrames . Quindi invece di creare un'istanza di un UserControl , cambierei semplicemente l'origine sul mio IFrame . Poiché i contenuti di IFrame erano pagine indipendenti, non ho riscontrato problemi con ViewState .

Ma sono preoccupato che IFrames potrebbe essere una cattiva scelta di progettazione, ma non capisco bene perché. Il sito non è pubblico, quindi i motori di ricerca non sono un problema.


Quindi, finalmente alla mia domanda.

Quali sono le mie opzioni per questo scenario? Se scelgo una soluzione Ajax (jQuery), dovrò mantenere il mio ViewState? Ci sono altre considerazioni che dovrei prendere in considerazione?

È stato utile?

Soluzione

Alcune altre opzioni:

  1. Solo il contenuto appare dinamico. Carichi abbastanza controlli sulla pagina per gestire qualsiasi cosa e in realtà mostra ciò di cui hai bisogno. Ciò consente di risparmiare molti problemi con lo stato di visualizzazione e simili, ma significa che la tua pagina ha un ingombro maggiore.
  2. Aggiungi dinamicamente i controlli alla pagina. Ci hai già giocato, quindi hai visto alcuni dei problemi qui. Ricorda solo che il posto in cui creare i controlli dinamici per i postback è nell'evento Page_Init () e che se vuoi che siano stateful, devi mantenerlo da qualche parte. Raccomando un database.

Altri suggerimenti

I controlli aggiunti in modo dinamico non persistono in viewstate e questa è la ragione per cui non importa se usi AJAX o iframe o altro.

Una possibile soluzione alternativa è quella di popolare nuovamente i controlli nel postback. Il problema è che il ciclo di vita della pagina (semplificato) è:

  1. Inizializza
    • LoadViewState
    • Carica dati postback
    • Controllo chiamate Carica eventi
    • Evento caricamento chiamata
    • Eventi di controllo delle chiamate
    • Control PreRender
    • PreRender
    • SaveViewState
    • Scaricare

Ciò significa che l'unico posto dove aggiungere nuovamente i controlli dinamici è Inizializza, altrimenti i dati pubblicati (o le informazioni viewstate) non verranno caricati in quel controllo. Ma spesso, poiché i dati Viewstat / postback non sono ancora disponibili in Initialize, il tuo codice non ha le informazioni necessarie per capire quali controlli devono essere aggiunti.

L'unica altra soluzione che ho trovato in questa situazione è usare un controllo di terze parti chiamato DynamicControlsPlaceholder . Funziona abbastanza bene e persiste le informazioni di controllo in viewstate.


Nel tuo caso particolare, non sembra che ci siano molte scelte / casi. È pratico solo avere tutti i diversi set di controlli nella pagina e inserirli in asp: controlli segnaposto, quindi impostarne uno su visibile, a seconda di ciò che è selezionato?

hai diverse opzioni e sì, gli IFrame sono stati una cattiva scelta nel design.

La prima opzione è la soluzione AJAX. E con ciò non c'è davvero uno scenario viewstate, è solo che stai trasmettendo i dati avanti e indietro con il server web, costruendo l'interfaccia utente al volo, se necessario.

L'opzione successiva è quella di aggiungere dinamicamente i controlli necessari per un determinato post, ogni volta. Il modo in cui funzionerebbe è che all'inizio del ciclo di vita della pagina, dovresti ricostruire la pagina esattamente come è stata inviata l'ultima volta, quindi scaricare tutti i controlli non necessari e creare solo quelli che vogliono .

Una terza opzione sarebbe quella di utilizzare le pagine Master. Il contenuto di livello superiore potrebbe trovarsi sulla stessa pagina Master e contenere collegamenti a varie pagine del sito Web.

Sono sicuro che mi sia concesso abbastanza tempo, potrei trovarne di più, ma questi 3 sono apparsi solo leggendo il tuo problema.

controlli dinamici e viewstate non si mescolano bene, come notato sopra - ma questa è una buona cosa, perché anche se lo facessero il viewstate per una pagina dinamica complessa sarebbe così gonfio che le prestazioni diminuirebbero a zero

usa Ajax [Mi piace AJAX PRO perché è molto semplice da usare] e gestisci tu stesso lo stato della pagina [in sessione, tabelle di database o qualunque cosa funzioni per il tuo scenario]. Questo sarà un po 'più complicato per iniziare, ma i risultati saranno efficienti e reattivi: ogni pagina può aggiornare solo ciò che deve cambiare, e non continuerai a mandare avanti e indietro una stringa di viewstate gigante

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