1

我有一个 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,我已经将它注册为一个带有ScriptManageron的回发控件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>

在同一个更新面板中。

当我单击此搜索按钮,然后单击下载图标时,它的行为完全符合预期(在客户端下载文件),并且控制台中没有错误。

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

请帮帮我。

4

1 回答 1

2

ImageButton在里面,DataList所以你必须在RegisterPostBackControl里面做你DataListItemDataBound事件。

protected void dtlSearchDetails_ItemDataBound(object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var imgBtn = e.Item.FindControl("dtlImgDownload") as ImageButton;
        ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(imgBtn);
        // your other code goes here.
    }
}
于 2012-05-30T05:47:13.013 回答