jQuery / Asp.Net MVC поиск имени пользователя - PullRequest
1 голос
/ 26 марта 2010

Хорошо, я не могу понять, почему следующий код всегда возвращает false ?? Я отлаживал с помощью firefox, чтобы увидеть, что происходит, но функция, кажется, всегда возвращает false, даже если имя пользователя условия взято 0 (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 ]

1 голос
/ 26 марта 2010

Пост выполняется асинхронно, поэтому он возвращается из вашей функции еще до того, как обратный вызов поста будет вызван. Вы должны предоставить обратный вызов вашей функции, который может быть вызван после завершения публикации, и выполнить все необходимые действия в каждом случае. Обратите внимание, что обратный вызов может принимать параметр, который обычно будет возвращаемым значением вашей функции (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 } );
1 голос
/ 26 марта 2010

Вы, кажется, не позволяете ему получить ответ от вызова действия. Что вам нужно сделать, это отключить асинхронный вызов и дождаться возвращения обратного вызова.

        $.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
                }
            }
        });

Действие, которое вызывается, может возвратить некоторый код json, используя JsonResult.

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

Надеюсь, это поможет.

1 голос
/ 26 марта 2010

В приведенном ниже фрагменте похоже, что вы создаете объект (newid) и затем проверяете, равен ли этот объект нулю. Разве это всегда не будет ложным?

var myObject = eval('(' + data + ')');
var newid = myObject;
if (newid == 0) {
   //stuff here
}

Если ваш ajax-скрипт буквально просто возвращает число 1 в виде простого текста, попробуйте привести данные к целому числу и проверить его.

var newid = parseInt(data);
if (newid == 0) {
   //stuff here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...