尽管VDWWD在为updatepanel创建postbacktrigger方面做得非常好,但是我的时间紧迫迫使我采用了另一种方法。
因此,我不是在GridView上使用<asp:CommandField>
并在SelectedIndexChanging
上进行下载,而是选择<asp:HyperLinkField>
,如下所示:
<asp:HyperLinkField Text="Download" DataNavigateUrlFields="Filename"
DataNavigateUrlFormatString="~/Members/Documents/{0}" Target="_blank" />
这里是chrome dev工具的确切错误文本:
未捕获错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。此错误的常见原因是通过调用Response.Write(),响应过滤器,HttpModules或服务器跟踪来修改响应。 详细信息:解析&#39; PK
附近时出错
在检查Fiddler中的HTTP响应时,我发现没有尝试进行文件传输,但看起来更像是将文件的二进制数据直接写入响应:
所以现在问题变成了我做错了什么以及如何解决它?
这是一个简单的概念:将上传的文件保存到某个位置,并在上传时将文件的文件路径保存在数据库中。
下载时,将文件从保存的路径传输到客户端。
那为什么它不起作用?
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();
那么单个更改的行如何打破它呢?
答案 0 :(得分:2)
您可以以编程方式添加PostBackTrigger。在这个片段中,它循环GridView中的所有行,并将每个下载按钮添加为触发器。
foreach (GridViewRow row in gvFiles.Rows)
{
LinkButton lb = row.FindControl("DownLoadButton") as LinkButton;
ScriptManager.GetCurrent(Page).RegisterPostBackControl(lb);
}