好的,对于我的生活,我无法理解为什么后面的代码总是返回false?我已经使用firefox进行了调试以查看发生了什么,但是即使条件用户名为0(false),函数似乎总是返回false,这里是jquery代码:
function CheckAvailability() {
showLoader();
$.post("/Account/CheckUsernameAvailability",
{ userName: $(profile_username).val() },
function(data) {
var myObject = eval('(' + data + ')');
var newid = myObject;
if (newid == 0) {
profile_username_error.removeClass("field_not_valid");
profile_username_error.addClass("field_valid");
$("#validUserName_msg").html("<font color='green'>Available</font>")
return true;
}
else {
profile_username_error.addClass("field_not_valid");
profile_username_error.removeClass("field_valid");
$("#validUserName_msg").html("<font color='red'>Taken</font>")
return false;
}
});
}
我正在使用/ Account / CheckUsernameAvailability来检查给定的名字是否被接受,不接受(0)应该返回true,否则返回false。
答案 0 :(得分:1)
在下面的代码段中,看起来您正在创建一个对象(newid),然后进行测试以查看该对象是否等于零。是不是总是是假的?
var myObject = eval('(' + data + ')');
var newid = myObject;
if (newid == 0) {
//stuff here
}
如果您的ajax脚本实际上只是将数字1作为纯文本返回,请尝试将数据转换为整数并对其进行测试。
var newid = parseInt(data);
if (newid == 0) {
//stuff here
}
答案 1 :(得分:1)
帖子是异步完成的,所以它甚至在调用post回调之前从你的函数返回。您应该为函数提供一个回调函数,该函数可以在帖子完成时调用,并执行每种情况下需要执行的操作。请注意,回调可以采用一个通常是函数返回值的参数(true / false)。
替代方法是切换到使用$ .ajax并将async
选项设置为true,然后捕获要在ajax回调函数内分配的局部变量中返回的值。
我会坚持回调的想法,因为同步请求可以锁定浏览器直到它完成。
FWIW,我发现JSON解析器工作正常 - 您不需要使用eval。只需将数据作为整数值返回并使用它。
function(data) {
if (data && data.ID == 0) {
...
my_callback( true );
}
else {
...
my_callback( false );
}
...
您的服务器端代码看起来有点像:
return Json( new { ID = user == null ? user.ID : 0 } );
答案 2 :(得分:1)
您似乎不允许它从动作调用中获取响应。您需要做的是设置异步调用并等待回调返回。
$.ajax(
{
type: "POST",
url: "/Account/CheckUsernameAvailability",
data: "userName=" + $(profile_username).val(),
dataType: "json",
success: function(data) {
if (data.Success) {
// do success stuff
}
else {
// do failure stuff
}
}
});
然后调用的动作可以使用JsonResult返回一些json代码。
public JsonResult CheckUsernameAvailability(string userName)
{
// do some checking with the Membership code
// this is just a simple class which can set the data and then
// be passed through to be sent back to the browser as Json
var result = new UiResult
{
Message = "Availble",
Success = true
};
return Json(result);
}
希望这有帮助。