我有一个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返回(但是当状态代码为200时,OnSuccess只能触发!!!),为什么?
问题2:
有时OnSuccess
函数永远不会触发,即使状态代码是200 !!!,为什么?
答案 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错误。