El Blog del Leo

Compartiendo lo que aprendo

Generar postback dentro de un UpdatePanel para descargar archivo



Creo que muchos hemos tenido problemas cuando en una grilla tenemos un boton que nos sirva, por ejemplo, para descargar archivos adjuntos, utilizamos una rutina conocida que podemos encontrar en cualquier parte descargar archivos pero nos arroja un error de javascript y no sabemos que hacer.

¿Cuál es el problema? Por lo general, tenemos nuestras grillas dentro de UpdatePanels los cuales por su naturaleza, intentan capturar todas los postback y convertirlas en llamadas asincronas, la cual no podemos generar completo el request en el servidor para generar el archivo y paf! error.

Solución. La solución parte por decirle a nuestro querido UpdatePanel, hey! cuando el usuario haga click en este botón para poder descargar el archivo dejalo generar el postback, no te preocupes. No creo que con palabras entienda pero si con un pequeño codigo lo tendrá que hacer:

Como este ejemplo es cuando el boton este en una grilla, al momento que se este creando la grilla le diremos lo siguiente:

Protected Sub gvAdjuntos_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvAdjuntos.RowDataBound
Try

If e.Row.RowType = DataControlRowType.DataRow And e.Row.RowState = DataControlRowState.Normal Or e.Row.RowState = DataControlRowState.Alternate Then

'Forzamos que el boton descargar genere un postback para poder descargar el archivo, ya que esta dentro del UpdatePanel
'Obtenemos el ScriptManager, en este caso se encuentra en una Master PageDim scriptManager = DirectCast(Master.FindControl("ScriptManager1"), ScriptManager)
' Y registramos el postback en este ScriptManager, cada vez que yo presiona el boton descargar, el Script Manager asistira para la generación del postback necesario para poder descargar el archivo
scriptManager.RegisterPostBackControl(DirectCast(e.Row.FindControl("imgbtDescargar"), ImageButton))
End If
Catch ex As Exception
Throw ex
End Try

End Sub

Y con este simple codigo podremos crear nuestro 'Descargar Archivo' dentro de una grilla que está en un UpdatePanel.
Saludos.


4 comentarios:

rapidofurioso dijo...

joajajao
Wenaa, a mi me paso xD, tuve que dejar la grilla fuera del update panel para que me la pudiera descargar :P (aunq no la necesitaba dentro del update panel)
Excelente codigo, ya se que hacer para la proxima ;)

Sigue asi Leo

Iván Carrasco F.

Iván dijo...

agregar este tag en el updatepanel tambien el bastante util:
<Triggers>
<asp:PostBackTrigger ControlID="linkDownload" />
</Triggers>

con este tag el link o el control que especifiques hace postback

Anónimo dijo...

Wow...tanto quebrarme la cabeza, para solo agregar un tag que hace el postback...Gracias Ivan!!!!

Gabo dijo...

Excelente aporte, me sirvio a la perfección.

En mi caso la solución planteada por Ivan (agregar TAG) no me funcionó debido a que el LinkButton que permite la descarga de archivos lo tengo contenido en un DataGrid que a su vez está dentro de otro DataGrid. Los UpdatePanel normalmente permiten en su TAG "asp:AsyncPostBackTrigger" que se haga referencia a los objetos anidados de la siguiente forma: "id_objeto1" + "simbolo dolar ($)" + "id_objeto2" + ... + "simbolo dolar ($)" + "id_objetoN", sin embargo, en el TAG "asp:PostBackTrigger" no me funcionó ese método.

Gracias por facilitarme la solución posteada.

Seguidores

Certificaciones

Microsoft Certified Professional

Mis Tweets

Twitter