AFAIK, l'approccio migliore a questo problema è:
- creazione dello UserControl in un evento della pagina
- aggiunta del controllo in un PlaceHolder
- impostazione del path dello UserControl in un HiddenField
- nell'OnInit della pagina creazione del controllo a partire da Request.Form, per permettere il caricamento del ViewState
protected override void OnInit(EventArgs e) { if(IsPostback) { var currentView = Request.Form[CurrentViewHiddenControl.UniqueID]; if (!string.IsNullOrEmpty(currentView)) { var control = LoadControl(currentView); control.ID = "MyView"; PlaceHolder1.Controls.Add(control); } } } protected void OnSelected(Item item) { PlaceHolder1.Controls.Clear(); var controlPath = GetControlPathByItem( item ); var control = LoadControl( controlPath ); control.ID = "MyView"; PlaceHolder1.Controls.Add(control); CurrentViewHiddenControl.Value = controlPath; }Ma non funziona se i controlli vengono creati in un UpdatePanel e la pagina ha una MasterPage; quello che succede è che il primo postback non viene gestito correttamente. E non c'è modo di farlo funzionare, se non togliendo la MasterPage. Ora, può anche darsi che esista qualche workaround molto tricky, ma è assurdo che un normale processo, come il ciclo di vita di una pagina, venga stravolto da un dettaglio grafico quindi MasterPage = leaky abstraction.
Nessun commento:
Posta un commento