下载功能在asp.net的更新面板中不起作用

Irf*_*aza 26 c# asp.net ajax

我有一个包含的Web用户控件FormView.formview显示求职者的详细信息.我已经为"下载简历"链接提供了一个按钮,以便admin/HR可以下载简历.我已将此控件放在包含UpdatePanel的aspx页面中.一切正常,除了下载链接.

我在donwload链接按钮上给出了一个命令,并且一个功能与开始下载的命令相关联.

以下是我实施的代码 -

//Command on 'Download' link button within FormView
protected void lnkDownload_Command(object sender, CommandEventArgs e)
{
    if (e.CommandName.Equals("Download"))
    {
        StartDownload(e.CommandArgument.ToString());
    }
}

//My routine to download document
//sFileInfo contains filepath$==$mimetype
protected void StartDownload(string sFileInfo)
{
    string[] d = sFileInfo.ToString().Split((new string[] { "$==$" }), StringSplitOptions.None);
    string filename = d[0];
    string docType = d[1];

    System.IO.FileInfo file = new System.IO.FileInfo(d[0]);

    if (file.Exists)
    {
        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=" + d[0]);
        Response.AddHeader("Content-Length", file.Length.ToString());
        Response.ContentType = d[1];
        Response.WriteFile(file.FullName);
        Response.End();
    }
    else
    {
        Server.Transfer("~/Mesgbox.aspx?cat=2");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果删除更新面板,则代码可以正常工作,但如果使用更新面板,则会生成脚本错误.

有什么建议....?

谢谢你分享你的时间.

Mit*_*tul 60

要启动整页回发,请在更新面板中添加回发触发器:

<asp:UpdatePanel runat="server">
    <Triggers>
        <asp:PostBackTrigger ControlID="YourControlID" />
    </Triggers>
    <ContentTemplate>
        .....
Run Code Online (Sandbox Code Playgroud)


小智 23

您无法在UpdatePanel部分回发中返回附件,因为ScriptManager使用结果更新DIV(而不是整个响应).您尝试做的最简单的修复方法是将下载按钮设置为回发控件.这将导致该按钮启动完整回发.以下代码包含在您的Page_Load中

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(this.lnkDownload);
Run Code Online (Sandbox Code Playgroud)


小智 5

您仍然可以从更新面板中触发下载文档.

我有一个更新面板,里面有3个嵌套的中继器.在最内部的转发器中,我使用LinkBut​​tons构建了一系列下载链接,每个链接都包含一个通过webservice获取文档并发送它的命令.

每个转发器都有一个OnItemDataBound方法.在最后一个中继器中,我有以下内容

        protected void LinkDocRepeaterOnItemDataBound(object sender, RepeaterItemEventArgs e) {
            if(!(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)) {
            return;
                }
            LinkButton linkButton = (LinkButton)e.Item.FindControlRecursive("LinkId");
            var scriptManager = ScriptManager.GetCurrent(this.Page);
            if (scriptManager != null) {
               scriptManager.RegisterPostBackControl(linkButton);
            }
        }
Run Code Online (Sandbox Code Playgroud)

每个Linkbutton现在都下载一个文档.