0

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

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

所有 JavaScript 函数都定义在一个特殊的命名空间中,例如Base, Register,... 。

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

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

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

4

1 回答 1

4

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

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

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

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

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

于 2012-11-23T08:38:06.727 回答