jQuery / Asp.Net mvc用户名查找

时间:2010-03-25 21:52:59

标签: jquery asp.net-mvc

好的,对于我的生活,我无法理解为什么后面的代码总是返回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。

3 个答案:

答案 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);
   }

希望这有帮助。