为什么我的文件下载失败?

时间:2017-10-23 12:45:30

标签: c# asp.net

还有另一种方式......

尽管VDWWD在为updatepanel创建postbacktrigger方面做得非常好,但是我的时间紧迫迫使我采用了另一种方法。

因此,我不是在GridView上使用<asp:CommandField>并在SelectedIndexChanging上进行下载,而是选择<asp:HyperLinkField>,如下所示:

<asp:HyperLinkField Text="Download" DataNavigateUrlFields="Filename"
    DataNavigateUrlFormatString="~/Members/Documents/{0}" Target="_blank" />

编辑1

这里是chrome dev工具的确切错误文本:

  

未捕获错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。此错误的常见原因是通过调用Response.Write(),响应过滤器,HttpModules或服务器跟踪来修改响应。   详细信息:解析&#39; PK

附近时出错

在检查Fiddler中的HTTP响应时,我发现没有尝试进行文件传输,但看起来更像是将文件的二进制数据直接写入响应:

enter image description here

所以现在问题变成了我做错了什么以及如何解决它?

原始问题

这是一个简单的概念:将上传的文件保存到某个位置,并在上传时将文件的文件路径保存在数据库中。

下载时,将文件从保存的路径传输到客户端。

那为什么它不起作用?

protected void gvFiles_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
    using (DataModel db = new DataModel())
    {
        var fileId = (Guid)gvFiles.DataKeys[e.NewSelectedIndex].Values["Id"];
        var file = db.ContractDocuments.FirstOrDefault(x => x.Id == fileId);

        if (file != null)
        {
            Response.Clear();
            Response.ContentType = file.MimeType;
            Response.AddHeader("content-disposition", $"attachment; filename={file.Filename}");
            Response.TransmitFile(file.FilePath);
            Response.End();
        }
    }
}

我在浏览器的开发工具中出现了解析器错误......关于&#34;这可能在使用response.Write()&#34;编辑响应时发生。

令人讨厌的是,当我从数据库中读取文件的二进制数据以供下载时(如下所示),它起作用了:

Response.Clear();
Response.ContentType = file.MimeType;
Response.AddHeader("content-disposition", $"attachment; filename={file.Filename}");
Response.BinaryWrite(file.FileData);
Response.End();

那么单个更改的行如何打破它呢?

1 个答案:

答案 0 :(得分:2)

您可以以编程方式添加PostBackTrigger。在这个片段中,它循环GridView中的所有行,并将每个下载按钮添加为触发器。

foreach (GridViewRow row in gvFiles.Rows)
{
    LinkButton lb = row.FindControl("DownLoadButton") as LinkButton;
    ScriptManager.GetCurrent(Page).RegisterPostBackControl(lb);
}