如何允许从UpdatePanel包装的控件下载文件?

时间:2012-05-30 04:41:48

标签: c# asp.net updatepanel httpresponse datalist

我有一个显示缩略图的Datalist控件和一个下载图标(ImageButton),Datalist包含在UpdatePanel下,当用户点击下载图标时,我调用以下函数允许在用户端下载文件

    protected void dtlSearchDetails_ItemCommand(object source, DataListCommandEventArgs e)
    {
        if (e.CommandName == "dtlImgDownload")
        {
            downloadFile(e.CommandArgument.ToString(), "~/uploads/primary/");
        }
}

功能:

public void downloadFile(string fileName, string filePath)
{
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", fileName));
    Response.WriteFile(filePath + fileName);
}

既然ImageButton / Datalist已包含在UpdatePanel中,我已将其注册为ScriptManager上的Page_Load的回发控件

if (dtlSearchDetails.Items.Count > 0)
{
    foreach (DataListItem li in dtlSearchDetails.Items)
    {
        ImageButton img = (ImageButton)li.FindControl("dtlImgDownload");
        ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(img);
   }
}

现在当我点击下载图标时没有任何反应,我在控制台中收到以下错误:

  

未捕获的Sys.WebForms.PageRequestManagerParserErrorException:Sys.WebForms.PageRequestManagerParserErrorException:消息   从服务器收到的邮件无法解析。常见原因   错误是通过调用Response.Write()修改响应时,   启用了响应过滤器,HttpModules或服务器跟踪。

但是,

在同一页面上还有其他控件,如搜索按钮,这些控件位于此UpdatePanel之外,但我已将其注册为

<trigger>
    <asp:AsyncPostBackTrigger ControlID="btnKeySearch" />
</trigger>

在同一个updatePanel中。

当我点击此搜索按钮,然后点击下载图标时,它的表现完全正常(在客户端下载文件)而没有控制台错误。

我无法找到此解决方法背后的原因。

请帮助我。

1 个答案:

答案 0 :(得分:2)

您的ImageButton位于DataList内,因此您必须在RegisterPostBackControl的{​​{1}}事件中执行DataList

ItemDataBound