2009-08-10 14 views
8

ho un problema.DropDownList in UpdatePanel

nel mio progetto ho inserito un dropdownlist in un updatepanel. Quello che volevo fare è selezionare un valore da dropdownlist e usarlo in una sessione.

ma qualunque cosa faccia, mi darà sempre un valore nullo a causa del non controllo "Abilita AutoPostBack". E quando lo faccio, aggiornerà la pagina quindi questo non è quello che volevo.

come posso risolvere questo problema?

tutte le idee ...

risposta

19

Sembra che potresti non utilizzare correttamente la funzione UpdatePanel. Se si dispone di UpdatePanel impostato per l'aggiornamento quando i bambini attivano gli eventi, solo UpdatePanel deve essere aggiornato, non l'intera pagina. Il codice seguente sembra comportarsi in modo simile a quello che stai cercando. Quando si modifica il menu a discesa, solo il pannello di aggiornamento torna al server e quando si aggiorna la pagina, è possibile ottenere il valore fuori dalla sessione.

ASPX CODICE

<form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <div> 
     Current Time: <asp:Label ID="lblTime" runat="server" /><br /> 
     Session Value: <asp:Label ID="lblSessionValue" runat="server" /><br /> 
     <br /> 
     <asp:UpdatePanel ID="upSetSession" runat="server"> 
      <ContentTemplate> 
       <asp:DropDownList ID="ddlMyList" runat="server" 
        onselectedindexchanged="ddlMyList_SelectedIndexChanged" 
        AutoPostBack="true"> 
        <asp:ListItem>Select One</asp:ListItem> 
        <asp:ListItem>Maybe</asp:ListItem> 
        <asp:ListItem>Yes</asp:ListItem> 
       </asp:DropDownList> 
      </ContentTemplate> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="ddlMyList" 
        EventName="SelectedIndexChanged" /> 
      </Triggers> 
     </asp:UpdatePanel> 
    </div> 
</form> 

codice dietro

protected void Page_Load(object sender, EventArgs e) 
    { 
     this.lblTime.Text = DateTime.Now.ToShortTimeString(); 
     if (Session["MyValue"] != null) 
      this.lblSessionValue.Text = Session["MyValue"].ToString(); 
    } 

    protected void ddlMyList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Session.Remove("MyValue"); 
     Session.Add("MyValue", this.ddlMyList.SelectedValue); 
    } 
+0

ora ho trovato un modo per risolvere questo penso.come ho detto ho chiamato dinamicamente 7 file ascx in un updatepanel.if io uso If (IsPostBack) Quindi .... fine Se forse posso farlo lavoro – iersoy

+0

Generalmente aggiungo il controllo if (IsPostback) al caricamento della pagina e alle funzioni di init della pagina se hanno qualche contenuto ... – RSolberg

+0

@RSolberg: mi hai salvato la giornata !!! –

3

Al fine di ottenere qualsiasi informazione archiviata per sessione, è necessario inviare al server.

Forse qualche altro dettaglio sul motivo per cui non si desidera l'aggiornamento di UpdatePanel sarebbe utile e cosa si sta cercando di ottenere utilizzando il valore in Session.

MODIFICA: In base ai commenti, mi sembra che la soluzione sarebbe quella di archiviare il file .ascx corrente in Session e impostare DropDownList in modo che l'autopostback sia abilitato.

Quindi, per la gestione dei pulsanti "Avanti" e "Indietro", memorizzare un indicatore per il corretto .ascx su Sessione.

Durante la gestione postback dell'evento dropdownlist, è sufficiente assicurarsi che il file .ascx corrente sia ancora visualizzato, controllando la sessione per visualizzare il file corretto. Quando il risultato viene restituito al client, non sembra che nulla sia cambiato, poiché UpdatePanel è abbastanza intelligente da comprendere che è lo stesso contenuto e che il valore dell'elenco a discesa sarà stato gestito correttamente.

+0

così ho creato una procedura guidata come structure.and suo molto complicato actually.but fatemelo dire u this.I ha 7 ascx file che nel mio file default.aspx c'è ScriptManager e UpdatePanel.nel mio updatepanel usando i pulsanti Avanti e Indietro io chiamo questi file .ascx dinamicamente in modo da dare una vista simile a una procedura guidata. Se autopostback il mio elenco a discesa tornerà al 1 ° webusercontrol denominato page1.ascx. questo non è accettabile per me.im cercando di trovare una soluzione, ma non ho ancora trovato – iersoy

+0

e utilizzando la sessione im pianificazione per memorizzare le variabili globali per l'utilizzo in altri file .ascx. – iersoy

+0

Ho aggiornato la mia risposta con una possibile soluzione per voi. – womp

1

Sembra che tu stia facendo molto più lavoro del necessario. Hai esaminato l'utilizzo di un controllo guidato di ASP.NET? http://msdn.microsoft.com/en-us/magazine/cc163894.aspx o semplicemente Google.

Se si vuole ancora fare a modo tuo, è necessario presentare al server (o senza AutoPostBack + manuale presentare tasto di scatto, o attivando AutoPostBack) dal momento che la sessione è un concetto sul lato server. HTTP è un protocollo stateless, quindi l'unico concetto di stato deve essere fatto al di fuori del dominio HTTP. Ciò significa che sei bloccato sullo stato di memorizzazione sul server (ad esempio, nella sessione) o, molto più restrittivamente, sul computer del cliente (come in un cookie).

+0

grazie lo vedrò. – iersoy

1

grazie mille ho risolto problema controllando le variabili in Page_Load.

If Label1.Text = 1 Then 
    Dim tempcontrol2 As Control = LoadControl("Page1.ascx") 
    PlaceHolder1.Controls.Add(tempcontrol2) 

ElseIf Label1.Text = 2 Then 
    Dim tempcontrol2 As Control = LoadControl("Page2.ascx") 
    PlaceHolder1.Controls.Add(tempcontrol2) 
End If 

u grazie per tutte le risposte