В проекте 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();
}
}
});
});
$.ajax — это асинхронный вызов, форма отправляется задолго до вызова функции успеха. измените тип кнопки с submit на button и отправьте форму в функции успеха.
Если подумать, вы также можете заставить $.ajax быть синхронным, указав async: false
Что вы ожидаете от результата? Вы указываете, что это должен быть json, но вы обрабатываете его как логическое значение



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы уточнить мой комментарий выше. изменять
<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();
}
}
});
});
Я скопировал и вставил из другого ответа для этой части. Хотя функционально это не ошибка, я согласен, что это плохая практика кодирования, поэтому я ее исправлю. Спасибо!
О, это работает нормально, это именно то, что я хочу, потому что этот код использует идентификатор кнопки, мне нужно только изменить тип ввода на кнопку вместо отправки, спасибо, чувак
Что я знаю очень давно, так это то, что действие перенаправления по умолчанию 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 в селекторе начинается с # ya mustafa .. $('#form-id') .. Но вы должны знать, что идентификатор должен быть уникальным .. это означает, что не используйте один и тот же идентификатор с более чем одним элементом .. если это так, код будет работать с только первый. чтобы использовать селектор с несколькими элементами, используйте class вместо id
Самый чистый способ сделать это:
$(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 работает правильно
Можете ли вы поделиться со мной с помощью Team Viewer. Я хочу посмотреть на поведение!
Вы можете попробовать отправить форму вместо нажатия кнопки