Больше нет постов после загрузки файла в sharepoint - PullRequest
9 голосов
/ 13 октября 2011

Я пытался скачать файл с 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: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();
            }

Ответы [ 6 ]

22 голосов
/ 13 октября 2011

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.

9 голосов
/ 06 ноября 2011

Существует простой способ обойти это. Зарегистрируйте событие 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>
7 голосов
/ 01 февраля 2013

У меня не получилось использовать '_spFormOnSubmitCalled'. Я имел успех, поместив это в мою функцию Page_Load.

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

Второй постбэк Ajax не работает в Sharepoint в UpdatePanel Предоставляет некоторую справочную информацию о том, почему это необходимо.

1 голос
/ 13 марта 2013

Я использую 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();   
}

Надеюсь, это поможет.

1 голос
/ 02 ноября 2011

есть еще более простое решение для всего этого. Вместо кнопки загрузки просто используйте

<a>

Я обычно использую что-то вроде:

<a href='<%# String.Format("{0}",BuildUrl(Eval("Title")))%>' title='<%#Eval("Title") %>'>Download</a>
0 голосов
/ 21 июля 2014

Если вы, ребята, не видели 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...