无法在UpdatePanel中下载文件

时间:2014-02-27 21:40:30

标签: asp.net .net vb.net http updatepanel

以下代码可以让我下载Word文档.....

   Try
        Response.BufferOutput = True
        HttpContext.Current.Response.Clear()
        HttpContext.Current.Response.Charset = ""
        HttpContext.Current.Response.ContentType = "application/msword"
        HttpContext.Current.Response.AddHeader("Content-Disposition", "inline;filename=myfile.doc")
        HttpContext.Current.Response.Write(s)
        'HttpContext.Current.Response.End()
        HttpContext.Current.ApplicationInstance.CompleteRequest()
        HttpContext.Current.Response.Flush()
    Catch ex As Exception
        Response.Write(ex.Message)
    End Try

但是只要我添加一个UpdatePanel - 它就不会下载文件并且不会产生错误?阅读后,我添加了一个触发器,其ControlID值设置为开始创建Word doc文件的按钮。我已经尝试了几种代码组合,但似乎没有任何效果。有关如何缩小范围的任何帮助?我也调试了,没有错误显示。我检查了我的下载文件夹 - 没有任何东西,尝试设置无缓存(Response.Cache.SetCacheability(HttpCacheability.NoCache)),但没有工作。一旦我删除UpdatePanel,那么一切似乎都有用吗?

   <asp:UpdateProgress ID="ProgressUpdate" AssociatedUpdatePanelID="UpdatePanel1" runat="server">
        <ProgressTemplate>
            <img alt="progress" src="../images/loading.gif" />
        </ProgressTemplate>
    </asp:UpdateProgress>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
     <Triggers>
            <asp:PostBackTrigger ControlID="buttonDownloadFile" />
     </Triggers>
       <ContentTemplate>
        ..

完全失去了这一个。有人可以建议解决方法或如何解决这个问题吗?

5 个答案:

答案 0 :(得分:8)

接受的答案是完全错误的。您需要使用scriptmanager注册控件。我在主页面中,这里是我用来注册任何按钮以便正确回发的代码。

private void MasterPageRegisterButtonForPostBack(Control bt)
        {
            MasterPage masterPage = Master;
            if (masterPage is MainMaster)
            {
                var mainMaster = masterPage as MainMaster;
                if (bt != null && mainMaster.MasterScriptManager != null)
                {
                    mainMaster.MasterScriptManager.RegisterPostBackControl(bt);
                }
            }
        }

答案 1 :(得分:3)

我按照以下方式工作:

在我的更新面板中我配置了可能会导致完整回发的控件,以便让下载工作。

(我也使用Master页面,这与Steve的解决方案相同,但是在aspx中注册,而不是在代码中注册)

<asp:UpdatePanel runat="server" ID="UpdatePanelDownload" UpdateMode="Conditional" ChildrenAsTriggers="True">
  <ContentTemplate>
      <asp:LinkButton ID="LinkButtonDownload" OnClick="Download_Click" runat="Server">Save XML</asp:LinkButton>
 </ContentTemplate>
  <Triggers>
    <asp:PostBackTrigger ControlID="LinkButtonDownlod" />
  </Triggers>
</asp:UpdatePanel>

答案 2 :(得分:0)

我必须在另一个窗口中打开一个ashx Generic Handler并传递一些会话变量,如文件名,完整路径等。

答案 3 :(得分:0)

我是这样做的

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
    <%foreach(var f in listOfObject){ %>
      <a class="btn btn-danger" href="javascript:__doPostBack('ctl00$BodyContent$butDownload', '<%=f.ID %>')" >Download</a>
    <%} %>
    </ContentTemplate>
</asp:UpdatePanel>  
    
<asp:LinkButton runat="server" ID="butDownload" OnClick="butDownload_Click" style="display:none;">LinkButton</asp:LinkButton>


///----Server-Side-----
    protected void butDownload_Click(object sender, EventArgs e)
    {
        string strID = Request["__EVENTARGUMENT"];
        if (!string.IsNullOrEmpty(strID))
        {
            int id = int.Parse(strID);
            //---Do what you want here
        }
    }

答案 4 :(得分:-4)

UpdatePanel不支持文件上载或下载。有很多支持ajax的组件可以做到这一点,谷歌是你的朋友。

编辑: -

一些例子: -

http://forums.asp.net/t/1076322.aspx?How+to+create+a+flipcart+like+panel+for+showing+products+in+gridview - 我喜欢这种方法,他使用JavaScript注入IFrame,指向负责下载文件的页面。在UpdatePanel内部工作

http://encosia.com/ajax-file-downloads-and-iframes/ - 类似方法