Как предотвратить отправку в зависимости от результата AJAX

В проекте ASP.NET MVC я хочу, чтобы кнопка не выполняла отправку, если результат, полученный из кода AJAX, является ложным.

Но это всегда заставляет подчиняться.

Это код:

@using (Html.BeginForm("Add", "Category", FormMethod.Post))
{

    <input name = "CategoryID" id = "myCategoryId" type = "text" value = "0" />

    <input name = "CategoryName" id = "myCategoryNameId" type = "text" value = "" />


    <input class = "btn btn-primary" id = "myid" type = "submit" value = "Add" />
}

и это код Javascript:

$('#myid').on('click', function(event) {

    var data = {};
    data.CategoryName = $("#myCategoryNameId").val();
    data.CategoryID = $("#myCategoryId").val();

    $.ajax({
        type: 'POST',
        data: JSON.stringify(data),
        url: '/Category/ValidateCategoryName',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) {

            if (!result) {

                event.preventDefault();
            }
        }
    });
});

Вы можете попробовать отправить форму вместо нажатия кнопки

SuperPrograman 07.02.2019 17:24

$.ajax — это асинхронный вызов, форма отправляется задолго до вызова функции успеха. измените тип кнопки с submit на button и отправьте форму в функции успеха.

MikNiller 07.02.2019 17:28

Если подумать, вы также можете заставить $.ajax быть синхронным, указав async: false

MikNiller 07.02.2019 17:50

Что вы ожидаете от результата? Вы указываете, что это должен быть json, но вы обрабатываете его как логическое значение

MikNiller 07.02.2019 17:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
594
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Чтобы уточнить мой комментарий выше. изменять

  <input class = "btn btn-primary" id = "myid" type = "submit" value = "Add" />

к

  <input class = "btn btn-primary" id = "myid" type = "button" value = "Add" />

И в вашей функции успеха измените

if (!result) {
   event.preventDefault();
}

к

if (result) {
   $('#myid').closest("form").submit();
}

Таким образом, вы будете отправлять форму только в том случае, если результат верен, если вызов ajax завершится ошибкой или результат будет ложным, тогда форма не будет отправлена.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: приведенный выше код может не работать, но я надеюсь, что вы поняли общую идею.

Ответ принят как подходящий

Я бы заменил элемент ввода кнопки отправки элементом кнопки, чтобы нажатие кнопки вызывало событие onclick без отправки формы. Затем, когда вы получите ответ ajax, вы можете условно использовать jQuery для отправки формы. Это может потребовать некоторых усилий, чтобы получить форму из onclick, но это не позволит вам отправить форму слишком рано, как я подозреваю, ваша проблема.

@using (Html.BeginForm("Add", "Category", FormMethod.Post))
{
    <input name = "CategoryID" id = "myCategoryId" type = "text" value = "0" />
    <input name = "CategoryName" id = "myCategoryNameId" type = "text" value = "" />
    <button class = "btn btn-primary" id = "myid">Add</button>
}

и

$('#myid').on('click', function(event) {
    var data = {
        CategoryName: $("#myCategoryNameId").val(),
        CategoryID: $("#myCategoryId").val()
    };
    $.ajax({
        type: 'POST',
        data: JSON.stringify(data),
        url: '/Category/ValidateCategoryName',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) {
            if (result) {
                $('#myid').closest('form').submit();
            }
        }
    });
});

Я скопировал и вставил из другого ответа для этой части. Хотя функционально это не ошибка, я согласен, что это плохая практика кодирования, поэтому я ее исправлю. Спасибо!

Dillan Wilding 07.02.2019 18:08

О, это работает нормально, это именно то, что я хочу, потому что этот код использует идентификатор кнопки, мне нужно только изменить тип ввода на кнопку вместо отправки, спасибо, чувак

mustafa 07.02.2019 19:37

Что я знаю очень давно, так это то, что действие перенаправления по умолчанию Form не будет ждать, пока ajax вернет свой результат.. Таким образом, вы можете использовать логическую переменную для управления этим.. см. следующий код

$(document).ready(function(){
  var DefaultFormAction = false;   //set the default form action to false
  $('form').on('submit' , function(e){
    var $this = $(this);
    if (DefaultFormAction == false){  // when the default action is false 
      e.preventDefault();   // prevent the default redirect
      setTimeout(function(){   // I use setTimeout here for testing .. Use the next code in your ajax success
        DefaultFormAction = true;   // return default action to true
        $this.submit();       // then submit the form again
      } ,10000);
      console.info('This result when default is false you will go to the default form action after 10second');
    }
  });
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <input name = "CategoryID" id = "myCategoryId" type = "text" value = "0" />
  <input name = "CategoryName" id = "myCategoryNameId" type = "text" value = "" />
  <input class = "btn btn-primary" id = "myid" type = "submit" value = "Add" />
</form>

Для проверки действие перенаправления Form по умолчанию не будет ждать, пока ajax вернет свой результат вы можете использовать e.preventDefault() внутри setTimeout и даже если вы сделаете время 1ms без $this.submit() он все равно будет использовать значение по умолчанию перенаправить

$(document).ready(function(){
  var DefaultFormAction = false;   //set the default form action to false
  $('form').on('submit' , function(e){
    var $this = $(this);
    if (DefaultFormAction == false){  // when the default action is false 
      setTimeout(function(){   // I use setTimeout here for testing .. Use the next code in your ajax success
        e.preventDefault();   // prevent the default redirect
      } , 1);
      console.info('This result when default is false you will go to the default form action after 10second');
    }
  });
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <input name = "CategoryID" id = "myCategoryId" type = "text" value = "0" />
  <input name = "CategoryName" id = "myCategoryNameId" type = "text" value = "" />
  <input class = "btn btn-primary" id = "myid" type = "submit" value = "Add" />
</form>

Спасибо @Mohammed, все работает правильно, но у меня много форм на странице, поэтому я хочу вместо этого использовать идентификатор формы, но не работать при использовании идентификатора, что я могу сделать? $('form-id').on('submit', function (e) { ... }

mustafa 07.02.2019 19:23

Идентификатор @mustafa в селекторе начинается с # ya mustafa .. $('#form-id') .. Но вы должны знать, что идентификатор должен быть уникальным .. это означает, что не используйте один и тот же идентификатор с более чем одним элементом .. если это так, код будет работать с только первый. чтобы использовать селектор с несколькими элементами, используйте class вместо id

Mohamed-Yousef 08.02.2019 01:47

Самый чистый способ сделать это:

$(document).on('submit','form' function(event) {
    event.preventDefault();
    event.stopImmediatePropagation();

    $this = $(this);

    var data = {};
    data.CategoryName = $("#myCategoryNameId").val();
    data.CategoryID = $("#myCategoryId").val();

    $.ajax({
        type: 'POST',
        data: JSON.stringify(data),
        url: '/Category/ValidateCategoryName',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) {
            if (result) {
                $this.submit();
            }
        }
    });
});

ничего не происходит, но код @Mohammed работает правильно

mustafa 07.02.2019 19:27

Можете ли вы поделиться со мной с помощью Team Viewer. Я хочу посмотреть на поведение!

TanvirArjel 07.02.2019 19:34

Другие вопросы по теме