我有一个 asp/vb.net 网络应用程序,为了与网站的其他部分保持一致,我使用 AJAX 并且我的控制按钮从 ascx 引发事件。客户端单击下载按钮已被用于处理帐户权限。
我下载到 CSV 函数使用 response.write,一旦我编写了 AJAX,输出就会停止,尽管代码仍然会触发。
目前我正在编写另一个未处理的空白 aspx 来执行 response.write 它正在通过我的控制按钮注册的启动脚本在新选项卡/窗口中打开。
必须有更好的策略。有什么想法吗?
我不太明白你所说的一切,但是当我过去从 AJAX 控件下载时,我不得不将下载按钮设置为完整的回发控件。您可以从 aspx/ascx 执行此操作,也可以像这样以编程方式执行此操作:
// The export button needs to do a full postback, regardless of whether we're in an
// AJAX UpdatePanel.
var updatePanel = GetParentUpdatePanel();
if (updatePanel != null)
{
var scriptManager = ScriptManager.GetCurrent(Page);
if (scriptManager != null)
{
scriptManager.RegisterPostBackControl(exportButton);
}
}
...
[CanBeNull]
private UpdatePanel GetParentUpdatePanel()
{
Control parent = Parent;
while (parent != null)
{
if (parent is UpdatePanel)
{
return (UpdatePanel) parent;
}
parent = parent.Parent;
}
return null;
}
我突然想到我应该分享我的解决方法,尽管这不是一个真正的答案。
我用一个简单的 onclientclick="myfunction" 打开一个新的 aspx
function myfunction() {
window.open('downloader.aspx?variable=something', '','width=400,height=200');
}
然后页面加载将查询字符串提供给我的下载功能,例如
下载(Request.QueryString(“变量”))
和下载现在可以使用
Response.Clear()
Response.ContentType = "text/csv"
Response.AddHeader("Content-Disposition", "filename=myFileName) & ".csv")
然后我使用了一个字符串生成器来写出一个标题和我的 csv
stringBuilder.Append("My Explainitory Header" & vbCrLf)
stringBuilder.Append("column 1 Header, column 2 header" & vbCrLf)
for each record in table
stringBuilder.append(value1 & "," & value2 & vbCrLf)
next
response.write(StringBuilder.toString)
response.end()
response.clear()
清除是防止输出到页面以及下载所必需的。结果取决于浏览器设置,但它要么是保存/打开提示,要么是自动打开到 excel 或 chrome/FF 下载文件,并在屏幕底部的下载栏中显示下载的文件链接。如果文件名是自动打开的,有时它会被 excel 覆盖。
适用于 FF Chrome 和 IE 10-7
在我的情况下,弹出窗口阻止程序是一个问题,因为我先做一些表单的东西,然后是 scriptmanager.registerstartupscript window.open,但这是可以避免的。