我首先应该说我在.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。我还需要使用动态文件名生成内容
答案 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)
我认为答案是确保LinkButton执行同步操作。我认为Joel的答案更好,但是这样的事情应该适用于帖子。
确保UpdatePanel的UpdateMode设置为“Conditional”并向更新面板添加触发器
<asp:UpdatePanel ... UpdateMode="Conditional">
<ContentTemplate>...</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="CsvLinkButton" />
</Triggers>
</asp:UpdatePanel>