Javascript ajax调用成功时提交表单,ajax调用失败时阻止提交

Javascript ajax调用成功时提交表单,ajax调用失败时阻止提交,javascript,c#,jquery,ajax,asp.net-core,Javascript,C#,Jquery,Ajax,Asp.net Core,我希望能够在ajax调用成功和失败时提交表单,以防止提交。有没有一种方法我可以做到这一点,但不给控制器打两次电话 控制器返回 return File(excelPackage.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName); AJAX调用 //Form contains action : /api/Excel/DownloadExcel $('#fo

我希望能够在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;
});

因为您有一个表单,并且您提交了它,所以默认情况下,它将基于
操作
属性向您的服务器发送请求

问题是您的表单发送了一个请求,然后您还向服务器发送了另一个请求。因此,您在控制器中的操作已收到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你不需要发送两个请求就可以做同样的事情。当事件失败时,我们可以抓住它。您可以再次检查我的代码,如果请求成功,将调用
try
块中的代码,如果请求失败,将调用
catch
块。还有一些方法可以做两次,但你似乎是在浪费资源。想象一下,如果您有100个用户同时单击下载按钮,您的操作将收到多少请求?200次请求,下载100次?