无法在VB ASP.NET中下载文件

时间:2016-08-14 18:40:37

标签: asp.net vb.net

  

未捕获的Sys.WebForms.PageRequestManagerParserErrorException:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。

点击下载按钮时出现此错误。

ASPX.cs

<asp:UpdatePanel runat="server" ID="UpdatePanelContent" UpdateMode="Conditional">
    <Triggers>
        <asp:PostBackTrigger ControlID="btnupload" />
    </Triggers>
    <ContentTemplate>
        <asp:FileUpload runat="server" ID="FileUpload1" value="Upload" />
        <asp:Button ID="btnupload" runat="server" OnClick="button1_click" Text="Upload"></asp:Button>
        <%-- <asp:LinkButton ID="OnLnkDownload" runat="server" OnClick="OnLnkDownload_Click" Font-Underline="False">Download</asp:LinkButton>--%>
    </ContentTemplate>
</asp:UpdatePanel>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" EmptyDataText="No files uploaded">
    <Columns>
        <asp:BoundField DataField="Text" HeaderText="File Name" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lnkDownload" Text="Download" CommandArgument='<%# Eval("Value") %>' runat="server" OnClick="DownloadFile"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lnkDelete" Text="Delete" CommandArgument='<%# Eval("Value") %>' runat="server" OnClick="DeleteFile" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

背后的代码

Protected Sub DownloadFile(ByVal sender As Object, ByVal e As EventArgs)
    Dim filePath As String = CType(sender, LinkButton).CommandArgument
    Response.ContentType = ContentType
    Response.AppendHeader("Content-Disposition", ("attachment; filename=" + Path.GetFileName(filePath)))
    Response.WriteFile(filePath)
    Response.End()
End Sub

请帮助我出错的地方?

1 个答案:

答案 0 :(得分:0)

使您的下载按钮成为HttpHandler的真正链接,而不是LinkBut​​ton。现在,您的更新面板会尝试将客户端JavaScript中的文件响应解析为HTML或其他内容。即使它有效,它仍然不如实际链接到该文件的专用URL。

为此,您需要在项目中添加HttpHanler。您将文件下载的代码放在处理程序的ProcessRequest方法中。

Response.ContentType = ContentType
Response.AppendHeader("Content-Disposition", ("attachment; filename=" + Path.GetFileName(filePath)))
Response.WriteFile(filePath)
Response.End()

现在传递你在URL中传递它们的参数说/MyHandler.ashx?filePath=someFile并使用QueryString属性而不是CommandArgument。例如QueryString [&#34; filePath&#34;]。请注意,处理程序应检查适用的权限(如果适用)。在您的页面中,您使用HyperLink控件并将NavigateUrl设置为指向处理程序的URL。您可以单独测试两个部件。首先通过在浏览器中键入URL来使Handler工作并进行测试,然后在页面中为HyperLink生成正确的URL。