我有一个带OnClientClick和OnClick事件的图像按钮。
<asp:ImageButton ImageUrl="./../../images/login.gif" Style="margin-right: 153px;"
runat="server" OnClientClick="return SendLoginData();" OnClick="Login_Click" />
OnClientClick,我调用了一些客户端函数SendLoginData(),其中我使用了$ .post()函数。
function SendLoginData() {
var flagLogin = "0";
if (LoginValidation() != false) {
$.post(window.location,
{
LOGIN: "LOGIN",
UserName: $.trim($('#txtUserNameLogin').val()),
Password: $.trim($('#txtPasswordLogin').val())
},
function (data) {
var d = $(data).find('#<%=lblMessageLogin.ClientID %>');
if ($(d).html() == "SUCCESS") {
flagLogin = "1";
}
else {
$('#lblErrorMsgLogin').html(d.html());
}
}
);
}
//alert(flagLogin);
if (flagLogin == "1") {
return true;
}
else {
return false;
}
}
Afer $ .post()当我得到“SUCCESS”的响应时,我想返回true给客户端函数SendLoginData。 这样我的服务器端onClick就可以工作了。
但我面临一个问题。 您可以看到有一个警报被注释(// alert(flagLogin);)。
如果我取消注释警报,那么if(flagLogin ==“1”)条件是否有效。然而,如果我按照评论保留警报,那么(flagLogin ==“1”)是不起作用的。
有人可以解释我如何处理这种情况以及这背后的原因是什么?
答案 0 :(得分:4)
因为请求是异步的。 AJAX调用不会“等待”请求完成,因此在请求完成之前执行“if”。
换句话说,代码继续执行流程,同时处理POST请求,并且当SendLoginData()
函数已经完成时,您的标志会被重视。
您应该在POST请求中的function (data)
位中管理登录成功。
顺便说一下:不要依靠JavaScript来验证登录,它可以通过极端轻松篡改。考虑一种激进的方法改变。
答案 1 :(得分:0)
我已使用下面的代码
解决了这种情况 function SendLoginData() {
var flagLogin = "0";
if (LoginValidation() != false) {
$.post(window.location,
{
LOGIN: "LOGIN",
UserName: $.trim($('#txtUserNameLogin').val()),
Password: $.trim($('#txtPasswordLogin').val())
},
function (data) {
var d = $(data).find('#<%=lblMessageLogin.ClientID %>');
if ($(d).html() == "SUCCESS") {
flagLogin = "1";
window.location = window.location + "?HOME=true";
}
else {
$('#lblErrorMsgLogin').html(d.html());
}
}
);
}
if (flagLogin == "1") {
return true;
}
else {
return false;
}
}
在这里,我使用window.location和回调函数中的一些查询字符串来执行我的服务器端代码,它运行正常。