在sharepoint中下载文件后不再回发

我试图从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()但仍然是相同的结果。

还有其他方法我应该尝试吗?

任何帮助将非常感激。 事实上,我几天前发布了这个问题,但只有一个人给了我第二种尝试方法,但它仍然没有用。

谢谢。

UPDATE

这是GridView下的GridView。

      <asp:Label ID="lblValueDate" Text='' runat="server" />                    <asp:HiddenField ID="hidCode" runat="server" Value='' />     <asp:Button ID="btnDownload" runat="server" CssClass="button submit" Text="Download" CommandName="download" OnCommand="onCmd" CommandArgument='' Width="80px"/> <asp:Button ID="btnUnbatch" runat="server" CssClass="button generic" Text="Un-Batch" CommandName="unbatch" OnCommand="onCmd" CommandArgument='' Width="80px"/>         

这是我的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(); } 

SharePoint在“提交”处理程序上注册JavaScript。 在此处理程序中,全局变量_spFormOnSubmitCalled设置为true 。 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);" 

当然,这有点hacky并没有在即将到来的SharePoint版本中工作。

有一种简单的方法可以解决这个问题。 注册OnClientClick事件以单击按钮并将_spFormOnSubmitCalled设置为false。

  

并将下面的脚本放在page / js文件中。

  

我没有成功使用’_spFormOnSubmitCalled’。 我把它放在我的Page_Load函数中确实取得了成功。

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

Ajax第二次回发在UpdatePanel中的Sharepoint中不起作用提供一些背景信息,说明为什么需要这样做。

所有这一切都有一个更简单的解决方案。 而不是下载按钮只需使用

我通常使用类似的东西:

 Download 

我正在使用SharePoint 2010和DexExpress,在我的visual webpart中,我需要添加的是clientSideEvents部分。 下面是我的代码……

    

和我的C#代码

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

希望这可以帮助。

如果你们还没有看到使用-asp-net-ajax-with-sharepoint-moss-2007 ,它会很好地解释这个问题。 这里有更好的解决方案。 感谢@SSK,这是正确方向的正确指针,我没有做到这一点。

但是在SP2013中至少有一个函数可以将_spFormOnSubmitCalled重置为false,因此不需要编写自己的函数。

  

在此处输入图像描述