在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中不起作用提供一些背景信息,说明为什么需要这样做。
我正在使用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,因此不需要编写自己的函数。