在 sharepoint 中下载文件后不再回发 [英] No more post back after file download in sharepoint

查看:14
本文介绍了在 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"><列><asp:TemplateField ItemStyle-Width="20%" ItemStyle-Horizo​​ntalAlign="Center"><项目模板><asp:Label ID="lblValueDate" Text='<%# getDate(Eval("ValueDate")) %>'runat="服务器"/></ItemTemplate></asp:TemplateField><asp:TemplateField><项目模板><asp:GridView ID="gvDetail" runat="server" AllowPaging="false" AllowSorting="false"CssClass="list-table border" HeaderStyle-CssClass="header" AutoGenerateColumns="false"><列><asp:TemplateField HeaderText="序列号" ItemStyle-Horizo​​ntalAlign="Left"ItemStyle-Width="30%" ><项目模板><%#((DataRowView)Container.DataItem)["MessageSeqNbr"] %></ItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="借方交易总数" ItemStyle-Horizo​​ntalAlign="Left"HeaderStyle-Horizo​​ntalAlign="居中"><项目模板><%#((DataRowView)Container.DataItem)["TotalDebitNbr"] %></ItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="Status" ItemStyle-Horizo​​ntalAlign="Left" ItemStyle-Width="25%"HeaderStyle-Horizo​​ntalAlign="居中"><项目模板><%#((DataRowView)Container.DataItem)["CodeDesc"] %><asp:HiddenField ID="hidCode" runat="server" Value='<%#((DataRowView)Container.DataItem)["Code"] %>'/></ItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="Action" ItemStyle-Horizo​​ntalAlign="Center" ItemStyle-Width="10%"HeaderStyle-Horizo​​ntalAlign="居中"><项目模板><asp:Button ID="btnDownload" runat="server" CssClass="button submit" Text="Download"CommandName="下载" OnCommand="onCmd" CommandArgument='<%#Eval("Id") %>'宽度="80px"/><asp:Button ID="btnUnbatch" runat="server" CssClass="button generic" Text="Un-Batch"CommandName="unbatch" OnCommand="onCmd" CommandArgument='<%#Eval("Id") %>'宽度="80px"/></ItemTemplate></asp:TemplateField></列></asp:GridView></ItemTemplate></asp:TemplateField></列></asp:GridView>

这是我的cs文件

 protected void gvGiro_RowDataBound(object sender, GridViewRowEventArgs e){网格视图 gr;if (e.Row.RowType == DataControlRowType.DataRow){gr = (GridView) e.Row.FindControl("gvDetail");使用 (class2 ct2= new Class2()){标签 lblValueDate = (Label)e.Row.FindControl("lblValueDate");日期时间 dt= 日期时间.MinValue;数据集 ds= ct2.GetData(dt);gr.DataSource = ds;gr.DataBind();}}}protected void onCmd(object sender, CommandEventArgs e){字符串标识;开关(e.CommandName){案例分批":id= e.CommandArgument.ToString();分批(id);休息;案例下载":id= e.CommandArgument.ToString();下载(id);休息;默认:休息;}}受保护的无效下载(字符串ID){//要做 - 替换所有硬编码的 guidGuid batchId = new Guid(id);字符串文件名 = "";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 = "下载";btn.Click += DownloadButton_Click;//设置客户端点击处理程序btn.OnClientClick = "window.setTimeout(function() { _spFormOnSubmitCalled = false; }, 10);"

当然,这有点老套,不能保证在即将推出的 SharePoint 版本中工作.

I tried to download a file from sharepoint. But after I download this file, I can't click on other buttons. What is wrong with my coding?

This is my first way.

            Response.AppendHeader("content-disposition", "attachment; filename= " + fileName);
            Response.ContentType = "text/plain";
            Response.WriteFile(Server.MapPath("~/" + fileName));
            Response.End();

This is my second way

            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();

I even comment Response.End() but still the same result.

Is there any other way I should tried?

Any help would be really appreciated. In fact, I posted this question a few days ago, but only one gave me my second way to try but it is still not working.

Thanks.

UPDATE

Here is my GridView under 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>

Here is my cs file

    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 registers a JavaScript "on submit" handler. In this handler the global variable _spFormOnSubmitCalled is set to true. SharePoint uses this variable to check if a submit was executed and prevents any further submits. Since your "download postback" does not refresh the page this variable remains true. With the effect that that all other buttons stop working.

As a workaround you can set this variable to false in a client click handler on your download button:

Button btn = new Button();
btn.Text = "Download";
btn.Click += DownloadButton_Click;

// set the client click handler
btn.OnClientClick = "window.setTimeout(function() { _spFormOnSubmitCalled = false; }, 10);"

Of course thats a little hacky and is not garantueed to work in upcoming SharePoint versions.

这篇关于在 sharepoint 中下载文件后不再回发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆