我有一个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应该阻止这种情况发生时,它正在重新加载页面。修复或解决方法是将其更改为按钮而不是表单。
答案 0 :(得分:4)
通过在函数末尾添加()
,而不是传递匿名函数,而是将其作为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");
});
}
答案 1 :(得分:3)
问题是你是否正在立即执行传递给done
和fail
的函数。这导致这些功能在那时和那里被执行。
所以只需通过更改此
来传递函数.done((function () {
alert("Thank you for registering!");
})())
到这个
.done(function () {
alert("Thank you for registering!");
})
答案 2 :(得分:0)
你真的不应该在预期的注册失败上发送一个500的http状态,例如“email already exists”条件......这应该由表示成功/失败的参数来处理,作为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
}
});