У меня есть поле электронной почты, к которому прикреплен удаленный вызов проверки, чтобы проверить, существует ли введенный адрес электронной почты в системе. Как только пользователь вводит, вызывается метод контроллера, и он возвращает флаг.
У меня также есть глобальное событие ajaxStart, прикрепленное ко всем запросам ajax, которое показывает счетчик загрузки и блокирует страницу. Я хочу предотвратить выполнение ajaxStart этой конкретной функции. Насколько я могу судить, никакие объекты не передаются в событие ajaxStart, и я не уверен, как подавить его в этом конкретном запросе.
Это визуализированный html:
<input class = "form-control" data-val = "true" data-val-remote = "Email already exists" data-val-remote-additionalfields = "*.Email" data-val-remote-type = "POST" data-val-remote-url = "/account/emailexists" id = "Email" name = "Email" placeholder = "Business Email" type = "email" value = "" />
Вид модели:
public class RegisterViewModel
{
[Remote("EmailExists", "Account", HttpMethod = "POST", ErrorMessage = "Email already exists")]
public string Email { get; set; }
}
Контролер аккаунта:
[AllowAnonymous]
[HttpPost]
public JsonResult EmailExists(string Email)
{
var exists = Email.UserExists();
return Json(exists, JsonRequestBehavior.AllowGet);
}
Javascript:
$(function () {
$(document).ajaxStart(function () {
// Return if this is '/account/emailexists'
blockUI();
}).ajaxStop($.unblockUI);
//...
Для всех других функций ajax я использую параметр global: false для подавления прослушивателя глобальных событий — не знаю, как это сделать с помощью Unobtrusive Javascript.
Узнав о .ajaxОтправить(), я решил попробовать его вместо .ajaxStart(). См. различия этих двух событий здесь:
В чем разница между: 1. (ajaxStart и ajaxSend) и 2. (ajaxStop и ajaxComplete)?
.ajaxSend() and .ajaxComplete() fire once per request as they send/complete. This is why these handlers are passed arguments and the global/batch ones are not:
Я использовал аргумент объекта ajax, чтобы узнать, является ли URL-адрес запроса удаленным вызовом проверки, чтобы подавить значок загрузки. Пока этот подход работает нормально.
$(document).ajaxSend(function(e, xhr, settings) {
if (settings.url == '/account/emailexists') return;
blockUI();
});
$(document).ajaxStop(function () { $.unblockUI(); });