我尝试从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(),但结果仍然相同。
我还有其他尝试吗?
任何帮助都会非常感激。 事实上,我几天前发布了这个问题,但只有一个人给了我第二种尝试方法,但它仍然没有用。
感谢。
更新
这是我在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文件
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 :(得分:22)
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版本中工作。
答案 1 :(得分:9)
有一种简单的方法可以解决这个问题。 注册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>
答案 2 :(得分:7)
使用'_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提供一些背景信息,说明为什么需要这样做。
答案 3 :(得分:1)
所有这一切都有一个更简单的解决方案。而不是下载按钮只需使用
<a>
我通常使用类似的东西:
<a href='<%# String.Format("{0}",BuildUrl(Eval("Title")))%>' title='<%#Eval("Title") %>'>Download</a>
答案 4 :(得分:1)
我正在使用SharePoint 2010和DexExpress,在我的visual webpart中,我需要添加的是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();
}
希望这有帮助。
答案 5 :(得分:0)
如果你们还没有看到using-asp-net-ajax-with-sharepoint-moss-2007,那么它就能很好地解释这个问题。这里有更好的解决方案。感谢@SSK这是正确方向的正确指针,我没有这样做。
但是在SP2013中至少有一个函数可以将_spFormOnSubmitCalled重置为false,因此无需编写自己的函数。
<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="javascript:_spResetFormOnSubmitCalledFlag()"></asp:LinkButton>