ASP.Net: i controlli utente aggiunti al segnaposto in modo dinamico non possono recuperare valori

StackOverflow https://stackoverflow.com/questions/102483

  •  01-07-2019
  •  | 
  •  

Domanda

Sto aggiungendo alcuni controlli utente in modo dinamico a un controllo server PlaceHolder. Il mio controllo utente è composto da alcune etichette e da alcuni controlli della casella di testo.

Quando invio il modulo e provo a visualizzare il contenuto delle caselle di testo (all'interno di ciascun controllo utente) sul server, sono vuote.

Al termine del postback, le caselle di testo contengono i dati che ho inserito prima del postback. Questo mi dice che il testo nelle caselle viene mantenuto tramite ViewState. Non so perché non riesco a trovarli quando eseguo il debug.

Qualcuno può dirmi perché non dovrei vedere i dati inseriti dall'utente sul server?

Grazie per l'aiuto.

È stato utile?

Soluzione

Questo si basa sulla sequenza di eventi .NET v1, ma dovrebbe darti l'idea:

  • Inizializza (evento Init)
  • Inizia monitoraggio stato di visualizzazione (controlla se postback)
    • Carica stato di visualizzazione (se postback)
    • Carica dati postback (se postback)
  • Carica (Carica evento)
    • Genera eventi modificati (se postback)
    • Genera eventi di postback (se postback)
  • PreRender (evento PreRender)
  • Salva stato di visualizzazione
  • Render
  • Scarica (Scarica evento)
  • Smaltire

Come puoi vedere, il caricamento dei dati ViewState nei controlli avviene prima dell'evento Load. Pertanto, affinché i controlli aggiunti dinamicamente " mantengano " questi valori, devono essere presenti affinché la pagina ASP.NET ricarichi i valori in primo luogo. Dovresti ricreare quei controlli nella fase Init, prima che si verifichi Load View State.

Altri suggerimenti

Ieri ho capito che puoi effettivamente far funzionare la tua app come al solito caricando l'albero di controllo subito dopo l'attivazione di loadviewstateevent. se si ignora l'evento loadviewstate, si chiama mybase.loadviewstate e quindi si inserisce il proprio codice per rigenerare i controlli subito dopo, i valori per tali controlli saranno disponibili al caricamento della pagina. In una delle mie app utilizzo un campo viewstate per contenere l'ID o le informazioni sull'array che possono essere utilizzate per ricreare tali controlli.

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub

Credo che dovrai aggiungere UserControl a PlaceHolder durante la fase Init del ciclo di vita della pagina, in modo che ViewState venga riempito dalla fase Load per leggere quei valori. È questo l'ordine in cui li stai caricando?

Assicurati di definire i controlli dinamici a livello di classe e di aggiungerli al contenitore ASP:

Private dynControl As ASP.MyNamespace_MyControl_ascx

E quando si crea un'istanza del controllo, assicurarsi di chiamare LoadControl in modo che l'oggetto venga aggiunto correttamente:

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)

Devi creare i tuoi controlli nel gestore eventi Page_PreInit. Il modello di controllo del server ASP.NET è complicato; devi comprendere appieno il ciclo di vita della pagina per farlo bene.

Come altri hanno già detto, qualsiasi forma di manipolazione del controllo deve essere eseguita prima di creare viewstate.

Ecco un buon link nel ciclo di vita della pagina per aiutarti:

http://msdn.microsoft.com/en-us/library /ms178472.aspx

Abbiamo sperimentato la stessa cosa e l'abbiamo gestita usando i controlli fantasma su page_load che hanno lo stesso identico .ID e poi il post back raccoglie gli eventi e i dati. Come altri hanno detto, è l'aggiunta dinamica del controllo dopo che init ha già creato lo stato e i controlli aggiunti dopo non sono memorizzati.

Spero che questo aiuti un po '.

Voglio anche aggiungere che ho visto i controlli utente funzionare nel modo in cui ti aspetteresti semplicemente impostando la proprietà Control.ID in fase di esecuzione. Se non imposti l'ID, gli articoli potrebbero essere costruiti in un ordine diverso e funzionare in modo strano.

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