Метод действия ajax возвращает прерванный сеанс при вызове form.submit () - PullRequest
0 голосов
/ 03 февраля 2012

Я вытаскиваю свои волосы на этом. Я не понимаю, что происходит.

У меня есть метод Action, который возвращает JSon из метода Post. Нет аутентификации по этому методу. Это адаптация системы MVC 4 AjaxLogin (но использующая ее в MVC3)

Форма выполняет .post (), содержащую сериализованные данные. Если он не проходит проверку, он возвращает набор ошибок. Код выглядит так:

[HttpPost]
public JsonResult JsonLogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid) { ... }

    // If we got this far, something failed
    return Json(new { success = false, errors = GetErrorsFromModelState() });
}

Это вызывается в следующем jquery в методе, прикрепленном к обработчику отправки.

if (!$form.valid || $form.valid()) {
    $.post($form.attr('action'), $form.serializeArray())
        .done(function (json) { ... });
}

это странная часть. Если я использую кнопку отправки, все в порядке. Метод возвращается со статусом 200 (и выбор свойств по запросу в fiddler показывает SESSION STATE: Done.), И .done () выполняется.

Если я использую некоторый javascript для вызова form.submit (), тогда он делает сообщение, но http-запрос всегда завершается неудачей с СОСТОЯНИЕМ СЕССИИ: Прервано. (по-прежнему возвращает 200 код результата в соответствии с Fiddler) и .done () никогда не выполняется.

Буквально нет никакой разницы между любым заголовком или данными, отправляемыми методу действия в любом случае, но он всегда прерывается при использовании .submit () и всегда успешен при использовании кнопки отправки.

Я прикрепляю обработчик отправки следующим образом:

// Load the dialog with the content=1 QueryString in order to get a PartialView
$.get(url + separator + 'content=1')
    .done(function (content) {
        dialogs[id] = $('<div class="modal-popup">' + content + '</div>')
                // (jquery ui dialog code omitted for clarity)
                .filter('div') // Filter for the div tag only, script tags could surface
                .find('#frm_login') // Attach logic on forms
                    .submit(formSubmitHandler)
                .end();
        });

Этот сводит меня с ума. Любые предложения по поиску причины, по которой это прерывается?

EDIT:

Версия браузера не имеет значения, она делает то же самое в IE, Firefox, Chrome и т. Д.

EDIT2:

Я попытался просто нажать кнопку «Использовать JS», чтобы нажать кнопку «Отправить», и это также не удалось.

Кажется, это связано с тем, что я выполняю отправку по ссылке href следующим образом:

<div id="loginBn"><a href="javascript:$('#blah').click();">Login</a></div>

Следующий код завершается успешно.

<button onclick="javascript:$('#blah').click();"></button>

Он не должен пытаться перемещаться куда-либо, учитывая ссылку на javascript, но, похоже, прерывается из-за этого.

1 Ответ

0 голосов
/ 03 февраля 2012

Оказывается, что если вы используете свойство href ссылки для вызова javascript, то оно выполнит прерывание любого ajax-запроса, который выполняется из него. Я исправил это, используя вместо этого обработчик ссылки onclick.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...