为什么下载文件不能保存在模态弹出窗口中?

时间:2012-05-28 12:11:16

标签: asp.net ajaxcontroltoolkit

我正在打开一些面板,其中有一些像这样的代码

 <td rowspan="2">
                        <br />
                        <asp:UpdatePanel ID="updatePnl" runat="server">
                            <ContentTemplate>
                                <asp:LinkButton ID="lnkYurLevel" runat="server" ForeColor="#009999" Text="What are my next steps?"
                                    Font-Size="Medium" OnClick="lnkYurLevel_Click"></asp:LinkButton>
                            </ContentTemplate>
                        </asp:UpdatePanel>
                    </td>

 protected void lnkYurLevel_Click(object sender, EventArgs e)
    {
        if (lblFileName.Text != "")
        {
            string path = Server.MapPath(@"~\downloads\" + lblFileName.Text);
            System.IO.FileInfo file = new System.IO.FileInfo(path);
            if (file.Exists)
            {
                Response.Clear();
                Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
                Response.AddHeader("Content-Length", file.Length.ToString());
                Response.ContentType = "application/octet-stream";
                Response.WriteFile(file.FullName);
                Response.End();
            }
            else
            {
                Response.Write("This file does not exist.");
            }
        }

    }

然后点击按钮我打开一个要下载的文件但是没有出现下载,因为它没有保存在面板中,而是通过模型弹出打开。 现在,当它被放置在一个通过模型弹出窗口打开的面板中。它不起作用。 是什么原因?

2 个答案:

答案 0 :(得分:2)

您使用的UpdatePanel,期望从回发中获得非常具体的数据(实际上等待带有结果的结构),并且此数据用于javascript以更新其内容。你所做的就是彻底打破这些数据,你仍然希望工作。这不起作用,您从更新面板页面收到javascript错误。换句话说,更新面板会从您那里获取一些不知道如何处理它们的数据。

答案 1 :(得分:2)

UpdatePanel内的操作不会更改整个Response,只是页面的一部分。所以你不能指望Response.Write能够工作。另一种方法是使按钮强制为PostBack

<小时/> 像这样

PostBackTrigger添加asp:Button
<Triggers>
    <asp:PostBackTrigger ControlID="lnkYurLevel" />
</Triggers>

或者如果您想在代码隐藏中执行此操作,请执行此操作。

ScriptManager.GetCurrent(Page).RegisterPostBackControl(lnkYurLevel);