截获的表单提交在jQuery和ASP.NET MVC上生成阻止ajax请求

时间:2015-10-30 13:09:13

标签: javascript jquery ajax asp.net-mvc asynchronous

目前我遇到了一个非常奇怪的问题。我是一个单页应用程序,所有表单提交都是通过以下方式截获的:

$('body').on('submit', 'form', function (e) { 
    $.ajax({ ... }) 
    e.preventDefault(); 
    return false; 
});

在网站上的某些部分我会采取行动,这会触发两个请求。一个长期运行的和一个重复发生的一个检查长时间运行请求的状态(有点过时,但我有我的理由)。这很好。

但是,这与我的表单提交处理程序组合无效。

工作示例:

var checker = function() {
    $.ajax(/*check the state*/).done(function() {
        setTimeout(checker(), 750);
    });
};

$.ajax(//long running request);
checker();

不工作的例子:

var checker = function() {
    $.ajax(/*check the state*/).done(function() {
        setTimeout(checker(), 750);
    });
};

$('#my_form').submit();
checker();

在这种情况下,提交处理程序中的ajax请求将阻止所有其他请求,直到完成为止。有人对此有解释吗?参与此过程的所有控制器都用以下内容进行修饰:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

感谢您的帮助!

1 个答案:

答案 0 :(得分:-1)

知道了!事实上

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

没有效果,因为我们使用了自定义控制器工厂。不幸的是,我们只覆盖了GetControllerInstance()方法来解析查询字符串中的控制器类型,而不是GetControllerType()。由于这个问题,方法GetSessionStateBeavoir()总是返回SessionStateBehavior.Default,因为给予方法的Type为null,并且下面的检查包含在DefaultControllerFactory的原始实现中:

if (controllerType == null) {
    return SessionStateBehavior.Default;
}

所以我已经将我们的逻辑移动到确定控制器类型为GetControllerType(),现在一切都按预期工作。