我有一个API控制器,如果它有效,则返回HttpStatusCodeResult 200,如果他们无法注册,则返回500。问题是 .done 和 .fail 无论返回什么状态代码都会被调用。但是,信息是否正确发布。这是我的发布功能。任何可能导致这种情况的想法将不胜感激?
function register() {
$.post("../api/Register",
{
'Email': $("#rEmail").val(),
'Password': $("#rPassword").val()
})
.done((function () {
alert("Thank you for registering!");
})())
.fail((function () {
alert("Email already exists");
})());
}
编辑:问题是当jquery.unobtrusive应该防止这种情况发生时,它正在重新加载页面。修复或解决方法是将其更改为按钮而不是窗体。
传递匿名函数,而是通过在函数末尾添加()
来将其作为 IIFE 调用
function register() {
$.post("../api/Register", {
'Email': $("#rEmail").val(),
'Password': $("#rPassword").val()
}).done(function () {
alert("Thank you for registering!");
}).fail(function () {
alert("Email already exists");
});
}
问题是你立即执行传递给done
和fail
的函数。 这导致这些函数立即执行。
所以只需通过更改此函数来传递函数本身
.done((function () {
alert("Thank you for registering!");
})())
对此
.done(function () {
alert("Thank you for registering!");
})
您真的不应该在预期的注册失败(例如"电子邮件已存在"条件)时发送 http 状态 500...这应该由一个参数来处理,该参数表示成功/失败,作为 200 响应的一部分。
您可以使用成功或错误回调来处理意外的内部服务器错误(状态 500),如下所示:
$.ajax({
url : "../api/Register",
type : "post",
data : {"Email" : "you@example.com", "Password" : "pw"},
dataType : "json",
success : function(response){
// handle http 200 responses
if(response.registrationApproved){
alert("Thank you for registering!");
}else{
alert("email exists");
}
},
error : function(){
// handle 500 or 404 responses
alert("server call failed");
},
complete : function(){
// if needed.. this will be called on both success and error http responses
}
});