#c# #asp.net #sharepoint #download
#c# #asp.net #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(), но результат все тот же.
Есть ли какой-либо другой способ, который я должен попробовать?
Любая помощь будет очень признательна. На самом деле, я опубликовал этот вопрос несколько дней назад, но только один из них дал мне второй способ попробовать, но он все еще не работает.
Спасибо.
Обновить
Вот мой 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();
}
Комментарии:
1. Привет, что вы имеете в виду, говоря, что вы не можете нажимать другие кнопки? Вы имеете в виду другие кнопки в браузере?
2. ДА. Другие кнопки есть. После этого они не работают.
Ответ №1:
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);"
Конечно, это немного халтурно и не гарантировано для работы в будущих версиях SharePoint.
Комментарии:
1. Я пытаюсь использовать ваш путь. Но, к сожалению, я использую OnCommand для этой кнопки, и эти кнопки находятся внутри GridView. Когда я пытаюсь заменить btn.Click =DownloadButton_Click на btn. Command = onCmd, это не работает.
2. можете ли вы опубликовать код, который создает кнопку или представление сетки?
3. Спасибо за помощь, на самом деле это GridView внутри GridView. Я обновлю свой вопрос.
4. Добавление
OnClientClick
обработчика в asp не работает? =><asp:Button ... CommandName="download" OnCommand="onCmd" CommandArgument='<%#Eval("Id") %>' OnClientClick="window.setTimeout(function() { _spFormOnSubmitCalled = false; }, 10);" ... />
5. теперь это работает отлично!!! Спасибо большое!!! Ты потрясающий, у меня ушло около 4 часов, прежде чем ты мне помог!!
Ответ №2:
Есть простой способ обойти это. Зарегистрируйте событие 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>
Ответ №3:
Я не добился успеха, используя ‘_spFormOnSubmitCalled’. Я добился успеха, поместив это в свою функцию Page_Load.
string js = @"_spSuppressFormOnSubmitWrapper = true;";
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "js", js, true);
Вторая обратная отправка Ajax, не работающая в Sharepoint в UpdatePanel, предоставляет некоторую справочную информацию о том, почему это необходимо.
Комментарии:
1. это сработало для меня, когда изменение _spFormOnSubmitCalled не привело к 1 и спасибо, что спасли мой день
2. Ты спас мой день, приятель! (Я только что добавил этот код на свою страницу aspx, и он сработал как шарм: _spSuppressFormOnSubmitWrapper = true)
3. Спасибо, флип .. перепробовал много трюков, но у меня работает только твой 🙂 … еще раз спасибо
Ответ №4:
для всего этого есть еще более простое решение. Вместо кнопки загрузки просто используйте
<a>
Обычно я использую что-то вроде:
<a href='<%# String.Format("{0}",BuildUrl(Eval("Title")))%>' title='<%#Eval("Title") %>'>Download</a>
Комментарии:
1. В BuildUrl я должен написать код загрузки?
2. да, это именно то, что вы должны сделать. Обычно я делаю ссылку на служебный класс, где я это делаю, но вы также можете сделать это в коде вашего пользовательского элемента управления.
Ответ №5:
Я использую SharePoint 2010 и DexExpress, и внутри моей визуальной веб-части все, что мне нужно было добавить, это часть 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();
}
Надеюсь, это поможет.
Ответ №6:
Если вы, ребята, еще не видели использование -asp-net-ajax-with-sharepoint-moss-2007, это прекрасно объясняет проблему. Однако здесь есть лучшие решения. Благодаря @SSK это был правильный указатель в правильном направлении, без которого я не смог бы этого сделать.
Но в SP2013, по крайней мере, есть функция для сброса _spFormOnSubmitCalled в false, поэтому нет необходимости писать свой собственный.
<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="javascript:_spResetFormOnSubmitCalledFlag()"></asp:LinkButton>