2011-10-13 21 views
8

sharepointからファイルをダウンロードしようとしました。 しかし、このファイルをダウンロードした後、他のボタンをクリックすることはできません。 私のコーディングで何が問題になっていますか?共有ポイントでファイルをダウンロードした後にポストバックがありません

これが私の最初の方法です。

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

これは私の第二の方法

  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(); 

私もResponse.Endの()が、それでも同じ結果をコメントしています。

私は試してみるべき他の方法はありますか?

本当にありがとうございます。 実際、私は数日前にこの質問を掲載しましたが、1つだけが私に2番目の方法を教えてくれましたが、まだ動作していません。

ありがとうございました。ここで

UPDATE

は、GridViewコントロールの下で私の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> 

は、私のCSファイルには、SharePointは、ハンドラ "を提出の上、" JavaScriptを登録する

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

あなたが他のボタンをクリックすることができないことでこんにちは、あなたは何を意味するのですか?あなたはブラウザの他のボタンを意味しますか? –

+0

はい。他のボタンはそこにあります。これ以降は動作しません。 – kevin

答えて

22

です。このハンドラでは、グローバル変数_spFormOnSubmitCalledtrueに設定されています。 SharePointはこの変数を使用して、サブミットが実行されたかどうかをチェックし、それ以上のサブミットを防ぎます。あなたの "ダウンロードポストバック"はページをリフレッシュしないので、この変数は残りますtrue。他のすべてのボタンが機能しなくなるという効果があります。あなたは、ダウンロードボタン上のクライアントのクリックハンドラでこの変数をfalseに設定することができます回避策として

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

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

もちろん、少しハックのthatsと今後のSharePointのバージョンで動作するようにgarantueedされていません。

+0

私はあなたの道を利用しようとしています。しかし残念ながら、私はこのボタンのためにonCommandを使い、それらのボタンはGridViewの中にあります。 btn.Command = onCmdを使用してbtn.Click + = DownloadButton_Clickを置換しようとすると、動作しません。 – kevin

+0

ボタンまたはグリッドビューを作成するコードを投稿できますか? – Stefan

+0

Thxのurヘルプ、実際には、GridViewのGridView内です。私は私の質問で更新されます。 – kevin

1

これにはさらに簡単な解決策があります。この問題を回避する簡単な方法があります

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

BuildUrlでは、私はダウンロードコーディングを書く必要がありますか? – kevin

+0

これはまさにあなたがすべきことです。私は通常これを行うユーティリティクラスへの参照を行いますが、ユーザコントロールのコードの中で行うこともできます。 – Tjassens

9

:代わりにダウンロードボタンを単に

<a>

私は通常のようなものを使用します。 ボタンクリックのOnClientClickイベントを登録し、_spFormOnSubmitCalledをfalseに設定します。

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

そして、以下のスクリプトをpage/jsファイルに置きます。

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

私は '_spFormOnSubmitCalled'を使用して成功しませんでした。私はこれを私のPage_Load関数に置いて成功しました。

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

Ajax second postback not working in Sharepoint in UpdatePanelこれがなぜ必要なのかに関する背景情報を提供します。

+0

これは私のために働いた_spFormOnSubmitCalledを変更して+1しなかったし、私の一日を保存していただきありがとうございます – Etienne

+0

あなたは私の日の仲間を救った! (私はちょうど私のaspxページにこのコードを追加し、それは魅力のように働いた:_spSuppressFormOnSubmitWrapper = true) – Wint

+0

おかげでフリップ..多くのトリックを試みたが、私のために働く: - )...もう一度ありがとう – Vishal

1

私はSharePoint 2010とDexExpressを使用しています。ビジュアルWebパーツの中に追加する必要があったのは、clientSideEvents部分でした。以下の私のコードがある...

<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> 

と私のC#のコード

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

は、この情報がお役に立てば幸いです。

0

あなたがまだusing-asp-net-ajax-with-sharepoint-moss-2007を見ていない場合は、問題をきれいに説明します。しかしここにはもっと良い解決策があります。 @SSKのおかげで、これは正しい方向の正しいポインタであり、私はそれを実行できなかったでしょう。

しかしSP2013では、少なくとも_spFormOnSubmitCalledをfalseにリセットする機能がありますので、自分で作成する必要はありません。

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

enter image description here

関連する問題