目前我遇到了一个非常奇怪的问题。我是一个单页应用程序,所有表单提交都是通过以下方式截获的:
$('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)]
感谢您的帮助!
答案 0 :(得分:-1)
知道了!事实上
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
没有效果,因为我们使用了自定义控制器工厂。不幸的是,我们只覆盖了GetControllerInstance()方法来解析查询字符串中的控制器类型,而不是GetControllerType()。由于这个问题,方法GetSessionStateBeavoir()总是返回SessionStateBehavior.Default,因为给予方法的Type为null,并且下面的检查包含在DefaultControllerFactory的原始实现中:
if (controllerType == null) {
return SessionStateBehavior.Default;
}
所以我已经将我们的逻辑移动到确定控制器类型为GetControllerType(),现在一切都按预期工作。