2009-08-10 40 views
8

Tengo un problema.DropDownList en UpdatePanel

en mi proyecto he colocado una lista desplegable en un panel de actualización. Lo que quería hacer es seleccionar un valor de la lista desplegable y usarlo en una sesión.

pero haga lo que haga, siempre me dará valor nulo porque no marque "Habilitar AutoPostBack". Y cuando lo haga, actualizará la página, así que esto no es lo que quería.

¿cómo puedo resolver este problema?

alguna idea ...

Respuesta

19

Parece que no está utilizando correctamente la función UpdatePanel. Si tiene el UpdatePanel configurado para actualizar cuando los niños disparan eventos, solo el UpdatePanel debe actualizarse, no toda la página. El siguiente código parece comportarse de manera similar a lo que estás buscando. Al cambiar el menú desplegable, solo el panel de actualización se publica en el servidor y cuando actualiza la página, puede obtener el valor de la sesión.

ASPX CÓDIGO

<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> 

código detrás

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

oke ahora encontré una manera de cómo solucionar esto, creo. Como he dicho llamé dinámicamente a 7 archivos ascx en un updatepanel.if uso If (IsPostBack) Then .... End If tal vez pueda hacerlo trabajo – iersoy

+0

Normalmente agrego la verificación if (IsPostback) alrededor de las funciones de carga de página e inicio de página si tienen contenido ... – RSolberg

+0

@RSolberg: ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ –

3

Con el fin de conseguir cualquier cosa almacenada para la sesión, usted tiene que enviarlo al servidor.

Quizás sean útiles algunos detalles más sobre por qué no desea la actualización de UpdatePanel, y lo que está tratando de lograr utilizando el valor en Session.

EDIT: En base a sus comentarios, me parece que la solución sería almacenar el archivo .ascx actual en Session, y configurar DropDownList para que tenga habilitado el autopostback.

Por lo tanto, en su manejo de los botones "Siguiente" y "Atrás", guarde un indicador del archivo .ascx correcto en la Sesión.

Durante el tratamiento de devolución de datos del evento de la lista desplegable, simplemente puede asegurarse de que el archivo .ascx actual todavía se muestra, marcando la sesión para ver el archivo correcto. Cuando se devuelve el resultado al cliente, nada parece haber cambiado, porque UpdatePanel es lo suficientemente inteligente como para darse cuenta de que es el mismo contenido, y habrá tratado con éxito el valor de la lista desplegable.

+0

así he creado un asistente como el structure.and su muy complicada actually.but déjame decirte u this.i tiene 7 Ascx archivo y en mi archivo default.aspx hay ScriptManager y UpdatePanel.in mi panel de actualización usando los botones Siguiente y Atrás, llamo dinámicamente a estos archivos .ascx, de modo que se obtiene una vista de asistente. Si recupero automáticamente mi lista desplegable, volveré al 1st webusercontrol llamado page1.ascx. esto no es aceptable para mí. Estoy tratando de encontrar una solución pero aún no pude encontrar – iersoy

+0

y al usar la sesión estoy planeando almacenar variables globales para usar en otros archivos .ascx. – iersoy

+0

Actualicé mi respuesta con una posible solución para usted. – womp

1

Parece que hace mucho más trabajo de lo que necesita aquí. ¿Has investigado el uso de un control de asistente de ASP.NET? http://msdn.microsoft.com/en-us/magazine/cc163894.aspx o simplemente Google.

Si todavía quiere hacerlo a su manera, que tiene a presentar al servidor (ya sea sin AutoPostBack + manual del botón de envío clic, o habilitando AutoPostBack) ya que la sesión es un concepto del lado del servidor. HTTP es un protocolo sin estado, por lo que el único concepto de estado debe hacerse fuera del dominio de HTTP. Esto significa que está atrapado almacenando el estado en el servidor (por ejemplo, en la sesión) o, de forma mucho más restrictiva, en la computadora del cliente (como en una cookie).

+0

gracias lo estaré mirando. – iersoy

1

muchas gracias me resolvió el problema mediante el control de las variables en el evento 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 gracias por todas las respuestas