【问题标题】:Form submit cancels jQuery ajax call表单提交取消 jQuery ajax 调用
【发布时间】:2013-11-06 12:35:02
【问题描述】:

我有一个通用处理程序 (DownloadHandler.cs),它既可以生成 pdf,也可以下载 pdf。生成时我使用 jQuery ajax 调用,下载时我使用提交的表单元素。问题是表单元素取消了生成请求,因此永远不会调用“成功”事件(见下图)。

生成代码(从按钮调用):

$.ajax({
    type: "POST",
    url: "/DownloadHandler.ashx",
    data: {
        GeneratePdf: true
    },
    success: function (result) {
        console.log(result);
    },
    error: function (errorMessage) {
        console.log(errorMessage);
    }
});

下载代码(从按钮调用):

var data = { "GeneratePdf": false }

var inputs = '';

$.each(data, function (key, value) {
    inputs += '<input type="hidden" name="' + key + '" value="' + value + '" />';
});

$('<form action="/DownloadHandler.ashx" method="POST">' + inputs + '</form>').appendTo('body').submit().remove();

下载处理程序:

public void ProcessRequest(HttpContext context)
{
    if (!String.IsNullOrEmpty(context.Request["GeneratePdf"]) && Convert.ToBoolean(context.Request["GeneratePdf"]))
    {
        Thread.Sleep(3000);
        context.Response.Clear();
        context.Response.Write("GENERATING");
        context.Response.Flush();
    }
    else
    {
        Thread.Sleep(3000);

        FileInfo pdfFile = new FileInfo(@"C:\1.pdf");

        context.Response.Clear();
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + pdfFile.Name);
        context.Response.AddHeader("Content-Length", pdfFile.Length.ToString());
        context.Response.ContentType = "application/octet-stream";
        context.Response.WriteFile(pdfFile.FullName);
        context.Response.Flush();
    }
}

public bool IsReusable
{
    get
    {
        return false;
    }
}

我刚刚添加了一个 Thread.Sleep 来演示 pdf 的生成。我错过了什么还是应该使用其他方法?

【问题讨论】:

  • 提交表单会重新加载页面,不是吗?
  • 确实如此,但是当您返回带有“附件”标题的文件时,它只是下载它而不是重新加载页面。

标签: c# jquery ajax forms generic-handler


【解决方案1】:

也许您可以尝试使用表单在您的页面上定位一个微小的动态iframe。类似的东西:

var data = { "GeneratePdf": false }

var inputs = '';

$.each(data, function (key, value) {
    inputs += '<input type="hidden" name="' + key + '" value="' + value + '" />';
});

var f = $('<form action="/DownloadHandler.ashx" method="POST">' + inputs + '</form>');


var iframe = $('<iframe src="about:blank"/>')  // should be made tiny/transparent with some css
              .appendTo('body');

iframe.contents().find('html').append(f);
f.submit().remove();

【讨论】:

  • 这取消了 DownloadHandler.ashx 和 _blank iframe :( 当我提交表单时,页面上的所有内容似乎都被取消了。我正在考虑使用另一种下载 pdf 的方式,因为这似乎是问题
  • @Dumpen 修改了我的答案,将表单放入 iframe 中。我想一个可能的答案应该是这样的。希望这会有所帮助。
  • 它在 Chrome 中有效,但在 Internet Explorer 中无效。你知道为什么吗?编辑:有趣的是,我的原始帖子在 IE 中有效,但在 Chrome 中无效>.>
  • @Dumpen 您收到任何错误消息吗?随机想法:这可能是 src about:blank 的 iframe 的问题。您是否尝试过将有效的 html 文件(带有空白正文)作为 src 指向?
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2011-04-23
  • 2012-04-05
相关资源
最近更新 更多