在ajaxified页面上下载到CSV

时间:2013-08-02 15:53:30

标签: asp.net ajax vb.net

我有一个asp / vb.net网络应用程序,为了与网站的其余部分保持一致,我使用AJAX和我的控制按钮从ascx引发事件。客户端单击下载按钮已用于处理帐户权限。

我下载到CSV函数使用response.write,一旦我写了AJAX,输出就停止了,尽管代码仍然会触发。

目前我正在编写另一个未使用的空白aspx来执行response.write它是通过我的控制按钮注册的启动脚本在新的选项卡/窗口中打开的。

必须有更好的策略。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我对你所说的一切都不太了解,但是当我过去从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;
    }

答案 1 :(得分:1)

我觉得我应该分享我的解决方法,虽然这不是一个真正的答案。

我用一个简单的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,但这是可以避免的。