Bookmark and Share

Wednesday, October 11, 2006

Esportare dati da un UpdatePanel Atlas/Ajax

Problema: ho inserito un GridView in un UpdatePanel Atlas, la griglia contiene un bottone per ogni riga che permette di esportare un in formato RTF alcuni dati.
Senza UpdatePanel tutto ok, genero un postback, creo uno stream e lo scrivo in output tramite Response.BinaryWrite(byteArray) e Response.End() ed appare la simpatica finestra di download di IE.
Con UpdatePanel appare una popup di errore, in effetti il povero Atlas non sa come gestire lo stream in output che gli arriva dalla pagina.

Soluzione 1: escludere il bottone dall’UpdatePanel, ma il problema è che essendo all’interno di un GridView non può essere separato dalla griglia.

Soluzione 2:
Inserire nell’UpdatePanel un iframe nascosto:




Nell’evento
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{ if (e.CommandName == "Print")
{


Modifico l’attributo src del frame facendo puntare il frame ad una pagina helper che genera il file RTF

frameprint.Attributes.Add("src","Print.aspx?ACTION=PRINT");

Nel mio caso l’ID del documento da stampare non viene passato tramite QueryString ma utilizzando l’oggetto Session.

Nella pagina Print.aspx recupero i dati del documento, genero lo stream e lo scrivo all’interno del frame che ospitato dalla pagina principale.

La soluzione di eseguire un Response.Redirect sulla stessa pagina e di scrivere lo stream in output non funziona perché quando viene chiamata la Response.End per chiudere lo stream in output la pagina termina la propria esecuzione ed Atlas non funziona più.

Un’altra soluzione potrebbe essere escludere tramite javascript il postback di atlas ed utilizzare il vecchio postback .net dell’intera pagina… ho fatto qualche prova ma trovo che il metodo dell’iframe sia il più semplice.