调用form.submit()时,ajax action方法返回中止的会话

时间:2012-02-02 22:01:28

标签: jquery ajax asp.net-mvc asp.net-mvc-3

我正在把头发拉出来。我不知道发生了什么。

我有一个Action方法,它从Post方法返回一些JSon。此方法没有身份验证。它是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请求总是失败,并且SESSION STATE:Aborted。 (仍然根据fiddler返回200结果代码)并且永远不会执行.done()。

在任何一种情况下,发送到action方法的任何标头或数据之间几乎没有区别,但是在使用.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();
        });

这个让我发疯。有关找到这个中止原因的建议吗?

编辑:

浏览器版本并不重要,它在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 :(得分:0)

事实证明,如果你使用链接的href属性来调用javascript,那么它将对从它执行的任何ajax请求发出中止。我通过使用链接的onclick处理程序来修复它。