从页面返回动态非html内容的最佳方法

时间:2009-02-19 21:40:23

标签: c# asp.net

我首先应该说我在.NET 2.0环境中使用C#使用ASP.NET。特别是,当用户点击链接按钮时,我正在尝试生成csv下载。我的回发链接在UpdatePanel中。在过去(在ajax之前)返回非html内容我将使用如下代码:

string filename = e.CommandArgument.ToString();//somefile.csv
string fileContents = SomeClass.GetFile(filename);

Response.AddHeader("Content-disposition", 
                   string.Format("attachment; filename={0}", filename));
Response.Write(fileContents);

但由于内容并未尝试对浏览器进行全面刷新,因此该技术不起作用。

对于这种情况,有人有更好的方法吗?我有一个限制是我在项目的这一部分时遇到了.net 2.0,无法切换到3.5来解决这个问题。

P.S。我还需要使用动态文件名生成内容

4 个答案:

答案 0 :(得分:4)

我会避免为此产生回发。 Istead,你想使用一个完全独立的页面,最好甚至只是一个处理程序(* .ashx)。然后你可以使用普通的超链接,你的旧附件代码就可以了。

答案 1 :(得分:0)

在UpdatePanel内创建服务器端容器(甚至是带有runat =“server”的HTML DIV),并在刷新UpdatePanel时将.InnerHtml或.InnerText属性设置为fileContents变量。

答案 2 :(得分:0)

这是我用来从多维数组生成CSV下载的一些匿名代码。

Response.Clear();
Response.ClearHeaders();
Response.ContentType = "application/vnd.ms-excel";
String shippingFileName = "filename.csv";
Response.AddHeader( "Content-Disposition", "attachment; filename=" + shippingFileName );
String[] row = { "Head1", "Head2" .... };
Response.Write( arrayToCSVString( row ) ); // quotes commas, and other formatting niceties

foreach (row in arrayOfRows) Response.Write( arrayToCSVString( row ) );
Response.Flush();

答案 3 :(得分:0)

我认为答案是确保LinkBut​​ton执行同步操作。我认为Joel的答案更好,但是这样的事情应该适用于帖子。

确保UpdatePanel的UpdateMode设置为“Conditional”并向更新面板添加触发器

<asp:UpdatePanel ... UpdateMode="Conditional">
    <ContentTemplate>...</ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="CsvLinkButton" />
    </Triggers>
</asp:UpdatePanel>