venerdì, aprile 04, 2008

Asp.Net Ajax file Download

Ajax dona grandi vantaggi in termini di navigabilità, interattività e user experience alle vostre applicazione web.
Uno dei fattori che è spesso sottovalutato è la diminuzione del traffico generato dalle pagine, in quanto solo una piccola parte della pagina viene inviata dal server al browser.
In pratica evita di dover inviare ogni volta un documento intero, ma solo una parte.

Di contro, quando ci si trova a dover inviare un documento completo al browser, soprattutto se generato a runtime, sorgono dei problemi.
Se ad esempio nell'evento click di un bottone si genera un file excel

response.ContentType = "application/vnd.ms-excel"
response.AddHeader("Content-Disposition", "attachment; filename=report.xls")
response.write ...
response.end

Alla pressione del bottone il broser restituirà un messaggio di errore abbastanza chiaro:
Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server
trace is enabled.

Stiamo inviando al browser qualcosa di inadatto al contesto.
Fortunatamente aggirare il problema è abbastanza semplice:
registrando nei trigger del nostro UpdatePanel un nuovo PostBackTrigger collegato al nostro bottone di download
<asp:updatepanel id="UpdatePanel1" runat="server">
<triggers>
<asp:postbacktrigger controlid="ControlID">
</triggers>
Se invece il vostro controllo fosse generato a runtime, (es: un bottone inserito in GridView) sarà necessario effettuare al registrazione a runtime, dopo che il controllo è stato generato:

ScriptManager.GetCurrent(Page).RegisterPostBackControl(ImageButton1)

Etichette:



#