2010-02-25 6 views
42

Che cosa ho?Post Back non funziona dopo aver scritto i file per la risposta in ASP.NET

Ho una pagina ASP.NET che consente all'utente di scaricare il file a con un clic del mouse. L'utente può selezionare il file che desidera da un elenco di file disponibili (RadioButtonList) e fa clic sul pulsante di download per scaricarlo. (Non dovrei fornire il link per ogni file che può essere scaricato - questo è il requisito).

Cosa voglio?

Desidero che l'utente scarichi più file uno alla volta selezionando il pulsante di opzione richiesto e facendo clic sul pulsante.

Che problema sto affrontando?

Posso scaricare correttamente il file per la prima volta. Ma, dopo averlo scaricato, se seleziono qualche altro file e clicco sul pulsante per scaricarlo, fai clic sull'evento del pulsante non postback e il secondo file non verrà scaricato.

Io uso il seguente codice sull'evento pulsante di scatto:

protected void btnDownload_Click(object sender, EventArgs e) 
{ 
    string viewXml = exporter.Export(); 
    Response.Clear(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=views.cov"); 
    Response.AddHeader("Content-Length", viewXml.Length.ToString()); 
    Response.ContentType = "text/plain"; 
    Response.Write(viewXml); 
    Response.End(); 
} 

sto facendo qualcosa di sbagliato qui?

Lo stesso problema può essere replicato in IE6, IE7 e Chrome. Penso che questo problema sia indipendente dal browser.

+0

Se si è su un modulo abilitato Ajax (o controllo), può essere che il javascript Ajax sia confuso o bloccato poiché è stato restituito un documento diverso invece di restituire ciò che JavaScript si aspettava (alcune informazioni sullo stato di visualizzazione più l'html aggiornato che va in il pannello di aggiornamento). Vedi anche http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/55136e4e-e1f7-4a79-9b75-be09cd5594c2/ –

risposta

55

Ho avuto questo stesso problema con SharePoint. Ho un pulsante sulla pagina che invia un file e dopo aver fatto clic sul pulsante, il resto del modulo non rispondeva. Si scopre che è una cosa sharepoint che imposta la variabile _spFormOnSubmitCalled su true per impedire ulteriori segnalazioni. Quando inviamo un file questo non aggiorna la pagina, quindi è necessario impostare manualmente questa variabile su false.

Sul pulsante nella web part impostare OnClientClick su una funzione in javascript per la pagina.

<asp:Button ID="generateExcel" runat="server" Text="Export Excel" 
OnClick="generateExcel_Click" CssClass="rptSubmitButton" 
OnClientClick="javascript:setFormSubmitToFalse()" /> 

Quindi in javascript ho questa funzione.

function setFormSubmitToFalse() { 
    setTimeout(function() { _spFormOnSubmitCalled = false; }, 3000); 
    return true; 
} 

La pausa di 3 secondi ho trovato era necessario perché altrimenti ero impostando la variabile prima sharepoint impostarlo. In questo modo ho lasciato che sharepoint lo impostasse normalmente, quindi lo reimpostato su false subito dopo.

+0

Ho conosciuto questo bocconcino di informazioni in passato, ma ho completamente dimenticato. Grazie per avermi salvato ore ricordandomi. – DaleyKD

+0

ha funzionato come un incantesimo per la mia libreria di documenti sharepoint> problema di download di documenti. Tre applausi !!! – shoab

4

Scomparso, quello che stai facendo dovrebbe funzionare. Ho fatto con successo simili in passato, anche se ho usato un ripetitore e LinkButtons.

L'unica cosa che posso vedere che è diverso è che si sta utilizzando Response.Write() piuttosto che Response.OutputStream.Write(), e che si sta scrivendo il testo, piuttosto che binario, ma data la ContentType specificato, non dovrebbe essere un problema. Inoltre, chiamo lo Response.ClearHeaders() prima di inviare informazioni e successivamente il numero Response.Flush() (prima della mia chiamata allo Response.End()).

Se vi aiuterà, ecco una versione sterilizzata di ciò che funziona bene per me:

// called by click handler after obtaining the correct MyFileInfo class. 
private void DownloadFile(MyFileInfo file) 
{ 
    Response.Clear(); 
    Response.ClearHeaders(); 
    Response.ContentType = "application/file"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\""); 
    Response.AddHeader("Content-Length", file.FileSize.ToString()); 
    Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length); 
    Response.Flush(); 
    Response.End();   
} 

Si può prendere in considerazione il trasferimento del file in modo binario, forse chiamando System.Text.Encoding.ASCII.GetBytes(viewXml); e passando il risultato di tale a Response.OutputStream.Write().

Modificare il vostro codice leggermente:

protected void btnDownload_Click(object sender, EventArgs e) 
{ 
    string viewXml = exporter.Export(); 
    byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml); 
    // NOTE: you should use whatever encoding your XML file is set for. 
    // Alternatives: 
    // byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml); 
    // byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml); 

    Response.Clear(); 
    Response.ClearHeaders(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=views.cov"); 
    Response.AddHeader("Content-Length", bytes.Length.ToString()); 
    Response.ContentType = "application/file"; 
    Response.OutputStream.Write(bytes, 0, bytes.Length); 
    Response.Flush(); 
    Response.End(); 
} 
+0

Grazie, Randolpho. Nessuna fortuna con il codice modificato anche. Si sta comportando allo stesso modo :( – Vijay

+0

Hmm ... beh, sono perplessa Come ho già detto, quello che ho funziona bene È possibile che sia qualcosa che fai nel tuo codice prima che venga chiamato il gestore dei clic? prova a postare l'intera pagina e il code-behind – Randolpho

+0

Il 'Response.ClearHeaders()' sembrava essere critico nel mio caso.Grazie Randolpho. –

3

Rimuovere Response.End() e lasciare terminare la risposta naturalmente all'interno dell'ecosistema ASP.NET.

Se ciò non funziona, si consiglia di inserire il pulsante in un numero <form> separato e di inviare i dati richiesti a un gestore HTTP separato. Imposta il gestore HTTP per esportare l'XML invece di una pagina web.

+0

Inizialmente non avevo incluso 'Response.End()'. Non funzionava allora come bene! – Vijay

+1

Hmmm. Beh, forse puoi provare a mettere il pulsante in un separato '

' e postare i dati richiesti su un gestore HTTP separato che è configurato per esportare l'XML? –

+0

Inoltre, dovresti specificare una codifica del contenuto come 'Risposta .ContentEncoding = Encoding.UTF8' –

4

Un modo semplice per eseguire questa operazione senza rimuovere Response.End consiste nell'aggiungere js lato client per eseguire l'aggiornamento della pagina. Aggiungi il js alla proprietà onclientclick del tuo pulsante.

ad es.

onclientclick="timedRefresh(2000)" 

then in your html.. 

    <script type="text/JavaScript"> 
    <!-- 
    function timedRefresh(timeoutPeriod) { 
     setTimeout("location.reload(true);",timeoutPeriod); 
    } 
    // --> 

3

Ho avuto lo stesso problema. La funzione per eseguire il semplice Response.Writer ("") nell'evento Button Click sulla pagina aspx non è mai stata attivata.

Metodo della classe:

public test_class() 
{ 
    public test_class() { } 

    public static void test_response_write(string test_string) 
    { 
     HttpContext context = HttpContext.Current; 
     context.Response.Clear(); 
     context.Response.Write(test_string); 
     context.Response.End();     
    } 
} 

ASPX Pagina:

protected void btn_test_Click(object sender, EventArgs e) 
{ 
    test_class.test_response_write("testing...."); 
} 

Mentre stavo cercando di trovare la ragione, ho appena chiamato stessa funzione su Page_Load evento ha funzionato.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     test_class.test_response_write("testing...."); 
    } 
} 

Analizzare il problema ho scoperto che il Maestro page del corpo di quella pagina aspx era sotto <asp:UpdatePanel>.

L'ho rimosso e ha funzionato sull'evento Button_Click. Ti consiglierei di controllare anche questo.

Problemi correlati