【问题标题】:Submit form when ajax call is successful and prevent submit when ajax call failsajax调用成功时提交表单,ajax调用失败时阻止提交
【发布时间】:2019-12-12 04:42:56
【问题描述】:

我希望能够在 ajax 调用成功时提交表单,而在失败时阻止提交。有没有办法可以做到这一点,但不调用控制器两次?

控制器返回

return File(excelPackage.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);

AJAX 调用

//Form contains action : /api/Excel/DownloadExcel
$('#form').on('submit', function (e) {
    var submit = false;
    $.ajax({
        url: '/api/Excel/DownloadExcel',
        type: 'POST',
        data: $('#form').serialize(),
        async: false
    })
        .done(function () {
            submit = true;
        })
        .fail(function (response) {
            displayErrorMessage(response.status, response.responseText);
        });
    return submit;
});

【问题讨论】:

  • 您想将表单提交给另一个控制器操作吗?
  • 我想提交表单以下载我返回的文件,如果我阻止提交,文件将作为数据返回但不下载。

标签: javascript c# jquery ajax asp.net-core


【解决方案1】:

由于您有一个表单并提交它,它会默认基于action 属性向您的服务器发送请求。

问题是您的表单发送了一个请求,然后您还向服务器发送了另一个请求。因此,您在控制器中的操作已收到 2 个请求。

在您的情况下,我建议在向服务器发送请求之前调用方法preventDefault:

$('#form').on('submit', async function (e) {
    // add this line to your event to prevent submiting by default
    e.preventDefault();

    try {
        var file = await $.ajax({
            url: '/api/Excel/DownloadExcel',
            type: 'POST',
            data: $('#form').serialize(),
            async: false
        });

        console.log(file);

        return true;
    } catch (response) {
        displayErrorMessage(response.status, response.responseText);

        return false;
    }
});

我还重写了您的活动以使其清楚。


如果你想允许下载文件而不提交,你可以重写事件:

$('#form').on('submit', function (e) {
    e.preventDefault();

    return false;
});

$('#download').on('click', async function (e) {
    e.preventDefault();

    // your ajax code goes here...
});

【讨论】:

  • 对不起,如果我不清楚,但我想要调用请求两次的原因是因为我想检查请求是否会失败。检查后,我会再次提交表单以下载返回的文件。出于某种原因,当我阻止提交表单时,文件只会返回但不会自动下载。感谢您回答问题,我对编程很陌生。
  • @qwer1234asdf 你不需要发送 2 个请求来做同样的事情。我们可以在事件失败时捕获它。您可以再次查看我的代码,如果您的请求成功,将调用try 块内的代码,而当您的请求失败时将调用catch 块内的代码。仍然有一些方法可以做到两次,但似乎你在浪费资源。想象一下,如果您有 100 个用户同时单击下载按钮,您的操作会收到多少请求? 200 次请求 100 次下载?
猜你喜欢
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多