2011-10-13 16 views
8

Ho provato a scaricare un file da sharepoint. Ma dopo aver scaricato questo file, non posso fare clic sugli altri pulsanti. Cosa c'è di sbagliato nella mia codifica?Nessun post successivo dopo il download del file in sharepoint

Questo è il mio primo modo.

  Response.AppendHeader("content-disposition", "attachment; filename= " + fileName); 
      Response.ContentType = "text/plain"; 
      Response.WriteFile(Server.MapPath("~/" + fileName)); 
      Response.End(); 

Questo è il mio secondo modo

  byte[] bytes = System.IO.File.ReadAllBytes("D:\\" + fileName); 

      Response.ClearContent(); 
      Response.ClearHeaders(); 
      Response.AddHeader("Content-Type", "application/octet-stream"); 
      Response.AddHeader("Content-Length", bytes.Length.ToString()); 

      Response.AddHeader("content-disposition", "attachment; filename= " + fileName); 

      Response.BinaryWrite(bytes); 
      Response.Flush(); 
      Response.End(); 

Ho anche commentare Response.End(), ma ancora lo stesso risultato.

C'è qualche altro modo che dovrei provare?

Qualsiasi aiuto sarebbe molto apprezzato. In effetti, ho postato questa domanda qualche giorno fa, ma solo una mi ha dato il mio secondo modo di provare ma non funziona ancora.

Grazie.

UPDATE

Ecco il mio GridView sotto GridView.

  <asp:GridView ID="gvGiro" Width="100%" runat="server" GridLines="Both" AllowPaging="false" CssClass="form-table" ShowHeader="false" 
       AllowSorting="false" AutoGenerateColumns="false" OnRowDataBound="gvGiro_RowDataBound"> 
       <Columns> 
        <asp:TemplateField ItemStyle-Width="20%" ItemStyle-HorizontalAlign="Center"> 
         <ItemTemplate> 
          <asp:Label ID="lblValueDate" Text='<%# getDate(Eval("ValueDate")) %>' runat="server" /> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField> 
         <ItemTemplate> 

          <asp:GridView ID="gvDetail" runat="server" AllowPaging="false" AllowSorting="false" 
           CssClass="list-table border" HeaderStyle-CssClass="header" AutoGenerateColumns="false"> 
           <Columns> 
            <asp:TemplateField HeaderText="Sequence Number" ItemStyle-HorizontalAlign="Left" 
             ItemStyle-Width="30%" > 
             <ItemTemplate> 
              <%#((DataRowView)Container.DataItem)["MessageSeqNbr"] %> 
             </ItemTemplate> 
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Total Number of Debit Transaction" ItemStyle-HorizontalAlign="Left" 
             HeaderStyle-HorizontalAlign="Center"> 
             <ItemTemplate> 
              <%#((DataRowView)Container.DataItem)["TotalDebitNbr"] %> 
             </ItemTemplate> 
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Status" ItemStyle-HorizontalAlign="Left" ItemStyle-Width="25%" 
             HeaderStyle-HorizontalAlign="Center"> 
             <ItemTemplate> 
              <%#((DataRowView)Container.DataItem)["CodeDesc"] %> 
              <asp:HiddenField ID="hidCode" runat="server" Value='<%#((DataRowView)Container.DataItem)["Code"] %>' /> 
             </ItemTemplate> 
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Action" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="10%" 
             HeaderStyle-HorizontalAlign="Center"> 
             <ItemTemplate> 
             <asp:Button ID="btnDownload" runat="server" CssClass="button submit" Text="Download" 
           CommandName="download" OnCommand="onCmd" CommandArgument='<%#Eval("Id") %>' Width="80px"/> 
             <asp:Button ID="btnUnbatch" runat="server" CssClass="button generic" Text="Un-Batch" 
           CommandName="unbatch" OnCommand="onCmd" CommandArgument='<%#Eval("Id") %>' Width="80px"/> 
             </ItemTemplate> 
            </asp:TemplateField> 
           </Columns> 
          </asp:GridView> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
      </asp:GridView> 

Ecco il mio file cs

protected void gvGiro_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     GridView gr; 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      gr = (GridView) e.Row.FindControl("gvDetail"); 
      using (class2 ct2= new Class2()) 
      { 
       Label lblValueDate = (Label)e.Row.FindControl("lblValueDate"); 
       DateTime dt= DateTime.MinValue; 
       DataSet ds= ct2.GetData(dt); 
       gr.DataSource = ds; 
       gr.DataBind(); 

      } 

     } 
    } 


protected void onCmd(object sender, CommandEventArgs e) 
    { 
     string id; 
     switch (e.CommandName) 
     { 
      case "unbatch": 
       id= e.CommandArgument.ToString(); 
       Unbatch(id); 
       break; 
      case"download": 
       id= e.CommandArgument.ToString(); 
       Download(id); 
       break; 
      default: 
       break; 
     } 
    } 

    protected void Download(string id) 
    { 
     // to do - substitute all hard-code guid 
     Guid batchId = new Guid(id); 
     string fileName = ""; 
     Class1 ct = new Class1(); 


     { 
      if (!ct.FileExists(batchId , ref fileName)) 
      { 
       byte[] bytes = System.IO.File.ReadAllBytes("D:\\" + fileName); 
      Response.ClearContent(); 
      Response.ClearHeaders(); 
      Response.AddHeader("Content-Type", "application/octet-stream"); 
      Response.AddHeader("Content-Length", bytes.Length.ToString()); 
      Response.AddHeader("content-disposition", "attachment; filename= " + fileName); 
      Response.BinaryWrite(bytes); 
      Response.Flush(); 
      Response.End(); 
      } 
+0

Ciao, che cosa vuoi dire da voi non possono cliccare su altri pulsanti? Intendi gli altri pulsanti nel browser? –

+0

Sì. Gli altri pulsanti ci sono. Non funzionano dopo questo. – kevin

risposta

22

SharePoint registra un JavaScript "a presentare" gestore. In questo gestore la variabile globale _spFormOnSubmitCalled è impostata su true. SharePoint utilizza questa variabile per verificare se è stato eseguito un invio e impedisce ulteriori segnalazioni. Poiché il "download postback" non aggiorna la pagina, questa variabile rimane true. Con l'effetto che tutti gli altri pulsanti smettono di funzionare.

Come soluzione alternativa è possibile impostare questa variabile su false in un click gestore client sul pulsante di download:

Button btn = new Button(); 
btn.Text = "Download"; 
btn.Click += DownloadButton_Click; 

// set the client click handler 
btn.OnClientClick = "window.setTimeout(function() { _spFormOnSubmitCalled = false; }, 10);" 

Naturalmente Quello è un po 'hacky e non è garantueed a lavorare nelle versioni di SharePoint imminenti.

+0

Sto cercando di usare la tua strada. Ma sfortunatamente, utilizzo onCommand per questo pulsante e quei pulsanti si trovano all'interno di GridView. Quando provo a sostituire btn.Click + = DownloadButton_Click con btn.Command = onCmd, non funziona. – kevin

+0

puoi pubblicare il codice che crea il pulsante o la vista griglia? – Stefan

+0

Thx per l'aiuto, infatti, è GridView all'interno di GridView. Aggiornerò nella mia domanda – kevin

1

c'è una soluzione ancora più semplice a tutto questo. Invece di un pulsante per il download è sufficiente utilizzare un

<a>

Io di solito uso qualcosa di simile:

<a href='<%# String.Format("{0}",BuildUrl(Eval("Title")))%>' title='<%#Eval("Title") %>'>Download</a> 
+0

In BuildUrl, dovrei scrivere la codifica del download? – kevin

+0

sì, questo è esattamente quello che dovresti fare. Solitamente faccio riferimento a una classe di utilità in cui faccio questo, ma puoi farlo anche nel codice sottostante del controllo utente. – Tjassens

9

C'è un modo semplice per ovviare a questo. Registrare l'evento OnClientClick per il clic del pulsante e impostare _spFormOnSubmitCalled su false.

<asp:Button ID="Button1" runat="server" Text="Export" onclick="Button1_Click" OnClientClick="javascript:setFormSubmitToFalse()" /> 

E inserire lo script di seguito nel file page/js.

<script type="text/javascript"> 
    function setFormSubmitToFalse() { 
     _spFormOnSubmitCalled = false;   
     return true; 
    } 
</script> 
6

ho avuto alcun successo con '_spFormOnSubmitCalled'. Ho avuto successo inserendo questo nella mia funzione Page_Load.

string js = @"_spSuppressFormOnSubmitWrapper = true;"; 
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "js", js, true); 

Ajax second postback not working in Sharepoint in UpdatePanel fornisce alcune informazioni sul motivo per cui questo è necessario.

+0

questo ha funzionato per me mentre cambiava il _spFormOnSubmitCalled non ha fatto +1 e grazie per aver salvato il mio giorno – Etienne

+0

Hai salvato il mio amico del giorno! (Ho appena aggiunto questo codice alla mia pagina aspx e ha funzionato come un fascino: _spSuppressFormOnSubmitWrapper = true) – Wint

+0

Grazie capovolgere .. provato un sacco di trucchi, ma solo tuo lavoro per me: -) ... grazie ancora – Vishal

1

sto utilizzando SharePoint 2010 e DexExpress e dentro il mio webpart visivo tutto quello che ho bisogno di aggiungere ero la parte clientSideEvents. sotto è il mio codice ...

<dx:ASPxButton 
    runat="server" 
    ID="btnExportGrid" 
    Text="Export Data" 
    AutoPostBack="False" 
    OnClick="btnExportGrid_Click" Theme="Office2010Blue" Width="140px"  
    CausesValidation="False" > 
     <ClientSideEvents Click="function(s, e) {_spFormOnSubmitCalled=false;_spSuppressFormOnSubmitWrapper=true; }" /> 
</dx:ASPxButton> 

e il mio codice C#

protected void btnExportGrid_Click(object sender, EventArgs e) 
{ 
    gridExporter.WriteXlsToResponse(); 
} 

Spero che questo aiuti.

0

Se voi ragazzi non hanno visto using-asp-net-ajax-with-sharepoint-moss-2007 eppure spiega il problema in modo bello. Ci sono soluzioni migliori qui però. Grazie a @SSK questo era il puntatore corretto nella giusta direzione che non avrei potuto fare senza.

Ma in SP2013, almeno c'è una funzione per il ripristino _spFormOnSubmitCalled false già così non c'è bisogno di scrivere il proprio.

<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="javascript:_spResetFormOnSubmitCalledFlag()"></asp:LinkButton>   

enter image description here

Problemi correlati