为什么MVC ajax onSuccess函数甚至触发了状态代码为302

时间:2012-11-23 08:28:03

标签: javascript jquery asp.net-mvc

我有一个ajax表单,我已经定义了一些ajaxOptions变量并将其传递给Ajax.BeginForm

var ajaxOptions = new AjaxOptions
                      {
                          HttpMethod = "POST",
                          LoadingElementId = "loading",
                          OnBegin = "Base.loadingButton('#RegisterSubmit');",
                          OnSuccess = "Register.onSuccess",
                          OnFailure = "Base.onError"
                      };

所有JavaScript函数都在特殊的命名空间中定义,例如BaseRegister,....

现在,当表单提交并且在服务器中出现错误,代码:“0”和类型:“Sql”发生并用elmah记录,状态代码:“HTTP / 1.1 302 Found”从服务器返回。

问题1:
OnSuccess函数在这种情况下总是被触发,状态302返回(但是当状态代码为200时,OnSuccess只能触发!!!),为什么?

问题2:
有时OnSuccess函数永远不会触发,即使状态代码是200 !!!,为什么?

1 个答案:

答案 0 :(得分:4)

  

问题1:即使在这种情况下,OnSuccess函数总是被触发   返回状态302(但只有当状态代码为时,才会触发OnSuccess   200!),为什么呢?

这是因为当您对重定向的服务器端脚本执行AJAX请求时(状态代码302),AJAX遵循重定向到目标位置并最终以状态代码200 =>结束。因为请求成功,将触发OnSuccess。你无能为力 - 这就是AJAX的工作方式 - 你无法拦截302状态代码。

您是否正在使用它来检测重定向到登录页面方案?如果会话到期还是什么?处理此方案的正确方法是使用服务器中的401状态代码并在OnFailure方法中检测此事件。为了防止FormsAuthentication模块重定向到LogOn页面但发送401状态代码,您可以查看following article

  

问题2:有时OnSuccess函数永远不会触发,即使状态代码是200 !!!,为什么?

如果状态代码为200,则应始终触发OnSuccess,除非您有一些javascript错误。