Использование удаленной функции проверки JQuery

Я пытаюсь понять, как я могу это перевернуть:

$('#username').blur(function(){
    $.post('register/isUsernameAvailable', 
           {"username":$('#username').val()}, 
           function(data){
               if(data.username == "found"){
                   alert('username already in use');
               }
           }, 'json');
});

в нечто близкое к этому:

rules: {
        username: {
            minlength: 6,
            maxlength: 12,
            remote: {
                url: 'register/isUsernameAvailable',
                type: 'post',
                data: {
                    'username': $('#username').val()
                } 

            }
        }

Однако мне тяжело заканчивать это. Мне нужно вместо предупреждения, чтобы оно отображало сообщение об ошибке, но я могу установить это сообщение в реальных сообщениях проверки jquery.

http://docs.jquery.com/Plugins/Validation/Methods/remote#options

UPDATE:

По какой-то причине он не делает это как POST, он делает это как запрос GET и не уверен, почему. Вот обновленный код:

rules: {
        username: {
            minlength: 6,
            maxlength: 12,
            remote: {
                url: 'register/isUsernameAvailable',
                dataType: 'post',
                data: {
                    'username': $('#username').val()
                },
                success: function(data) {
                    if (data.username == 'found')
                    {
                        message: {
                            username: 'The username is already in use!'
                        }
                    }
                }

            }
        },

UPDATE 2:

Теперь я возвращаюсь куда-то, чтобы вернуться к получению запроса POST. У меня есть еще две проблемы. Одним из них является тот факт, что для выполнения другого запроса POST пользователь должен обновить форму. И последняя проблема заключается в том, что если найденное имя пользователя найдено, оно НЕ показывает сообщение об ошибке.

rules: {
        username: {
            minlength: 6,
            maxlength: 12,
            remote: {
                type: 'post',
                url: 'register/isUsernameAvailable',
                data: {
                    'username': $('#username').val()
                },
                dataType: 'json',
                success: function(data) {
                    if (data.username == 'found')
                    {
                        message: {
                            username: 'The username is already in use!'
                        }
                    }
                }

            }
        },

UPDATE:

public function isUsernameAvailable()
{
    if ($this->usersmodel->isUsernameAvailable($this->input->post('username')))
    {
        return false;
    }
    else
    {
        return true;
    }        
}

UPDATE 4:

контроллер:

public function isUsernameAvailable()
{
    if ($this->usersmodel->isUsernameAvailable($this->input->post('username')))
    {
        return false;
    }
    else
    {
        return true;
    }        
}

public function isEmailAvailable()
{
    if ($this->usersmodel->isEmailAvailable($this->input->post('emailAddress')))
    {
        return false;
    }
    else
    {
        return true;
    }        
}

МОДЕЛЬ:

/**
 * Check if username available for registering
 *
 * @param   string
 * @return  bool
 */
function isUsernameAvailable($username)
{
    $this->db->select('username');
    $this->db->where('LOWER(username)=', strtolower($username));
    $query = $this->db->get($this->usersTable);
    if ($query->num_rows() == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

/**
 * Check if email available for registering
 *
 * @param   string
 * @return  bool
 */
function isEmailAvailable($email)
{
    $this->db->select('email');
    $this->db->where('LOWER(email)=', strtolower($email));
    $query = $this->db->get($this->usersTable);
    if($query->num_rows() == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
 Jeff Davidson05 июн. 2012 г., 22:48
Так что ты думаешь я должен сделать?
 Jeff Davidson05 июн. 2012 г., 22:27
зачем мне это нужно Я работаю со стороной JS.
 Andrew Whitaker05 июн. 2012 г., 22:46
Вот как работает удаленное правило (по умолчанию). Если результат, возвращаемый серверомtrue (булево), тогда проверка для правила завершается успешно. Если возвращается строковый результат, это используется как сообщение об ошибке.
 Andrew Whitaker05 июн. 2012 г., 22:14
Вы можете изменить код на стороне сервера?
 Jeff Davidson05 июн. 2012 г., 20:53
Я включил ссылку на удаленную функцию.

Ответы на вопрос(6)

Решение Вопроса

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

$('#username').blur(function(){
    if($('#username').val().length < 6 || $('#username').val().length > 12)
    {
        alert('Username must be between 6 and 12 characters');
    }
    else
    {
       $.post('register/isUsernameAvailable', 
              {"username":$('#username').val()}, 
              function(data){
                  if(data.username == "found"){
                      alert('username already in use');
                  }
              }, 'json');
    }
});
 11 янв. 2019 г., 15:58
Этот ответ не связан с плагином
 05 янв. 2015 г., 08:52
Возможно, правильно, но не отвечает на вопрос

Удаленный метод предназначен для получения строки Json, поэтому ваша серверная сторона должна возвращать что-то подобное этому методу ...

echo(json_encode(true)); // if there's nothing matching
echo(json_encode(false));

Это пример кода JS, который я написал при попытке проверить псевдоним пользователя.

$(document).ready(function(){
            $('#form').validate({
            rules: {
                user_nickname: {
                    remote: {
                        url: "available.php",
                        type: "post",
                        data: {
                          user_nickname: function() {
                            return $( "#user_nickname" ).val();
                          }
                        }
                      }               
                }
            },
            messages:{
                user_nickname: {
                    remote: "Username already taken"
                }
            }
        });});

Надеюсь, это поможет кому-то, это помогло мне.

 22 нояб. 2015 г., 09:52
спасибо за кодировку json

что это старо, но мне было трудно заставить это работать, и я хотел поделиться тем, что сработало для меня.

Код проверки формы на стороне клиента:

$('#frmAddNew').validate({
onkeyup: false,
rules: {
    ADID: {
        required: true,
        alphanumeric: true,
        maxlength: 10,
        remote: {
            url: "ADIDValidation.cshtml",
            type: "post",
            dataType: "json",
            dataFilter: function (data) {
                if (data) {
                    var json = $.parseJSON(data);
                    if (json[0]) {
                        return JSON.stringify(json[0].valid) /* will be "true" or whatever the error message is */
                    }
                }
            },
            complete: function (data) {
               /* Additional code to run if the element passes validation */
                if (data) {
                    var json = $.parseJSON(data.responseText);
                    if (json[0]) {
                        if (json[0].valid === "true") {
                            $('#FirstName').val(json[0].FirstName);
                            $('#LastName').val(json[0].LastName);
                        }
                    }
                }
            }
        }
    }
},
messages: {
    ADID: {
        required: "Please Enter an ADID of the Employee",
        alphanumeric: "The ADID Can Only Contain Letters and Numbers",
        maxlength: "ADID For User's Current Permissions Must Be 10 Characters or Less"
    }
},
submitHandler: function (form) {
    form.submit();
},
errorContainer: $('section.errorCon'),
errorLabelContainer: $('ol', 'section.errorCon'),
wrapper: 'li',
showErrors: function (errors) {
    var error = this.numberOfInvalids();
    var message = error == 1
        ? 'You missed 1 field:'
        : 'You missed ' + error + ' fields:';
    $('section.errorCon h3').html(message);
    this.defaultShowErrors();
}
});

Серверный код для ADIDValidation.cshtml (я использую веб-страницы Razor):

@{

Layout = null;

if(IsPost)
{
    var db = Database.Open("<enter connection name>");
    var sql = "<enter sql or stored procedure>";
    var strADID = Request["ADID"];

    var result = db.Query(sql, strADID);
    IEnumerable<dynamic> response;

    if(result.Any()) 
    {
        @* "true" indicates the element passes validation. Additional data can be passed to a callback function *@
        response = result.Select(x => new
        {
            valid = "true",
            FirstName = x.FirstName,
            LastName = x.LastName
        });
    }

    else
    {
        @* The element did not pass validation, the message below will be used as the error message *@
        response = new[] {
            new {valid = "The Employee's ADID '" + strADID.ToString() + "' Is Not Valid. Please Correct and Resubmit"}
        };
    }

    Json.Write(response, Response.Output);
}
}

trueсообщение об ошибке в виде строки илиfalse с вашего серверного ресурса. СогласноJQuery проверить документацию для удаленного:

The response is evaluated as JSON and must be true for valid elements, and can be any false, undefined or null for invalid elements, using the default message; or a string, eg. "That name is already taken, try peter123 instead" to display as the error message.

Это означает, что если вы можете изменить свой серверный код для возвратаtrue в случае успешной проверки или сообщения об ошибке («имя пользователя уже используется») в случае неудачной проверки вы можете просто написать следующее удаленное правило:

remote: {
    type: 'post',
    url: 'register/isUsernameAvailable',
    data: {
        'username': function () { return $('#username').val(); }
    },
    dataType: 'json'
}

Вы также можете просто вернутьсяtrue или жеfalse от вашего серверного ресурса и определите сообщение об ошибке на клиенте. В этом случае у вас будет вышеуказанное правило, а затем свойство вmessages объект:

messages: {
    username: {
        remote: "username already in use"
    }
}
 Jeff Davidson05 июн. 2012 г., 23:38
это отправляет сообщение, которое находится в js, а НЕ в текстовой строке, которую я положил в ложном случае
 Jeff Davidson05 июн. 2012 г., 23:39
на секунду подумал, я думаю, что я только что загрузил неправильный файл ранее, потому что с возвращенным ложным истиной это вроде работает сейчас
 05 июн. 2012 г., 23:32
Что происходит, когда вы возвращаете строку в ложном случае? Это отображается тогда?
 05 янв. 2015 г., 08:51
Обратите внимание, что'username': $('#username').val() нужно обернуть в функцию, т.е.'username': function() { return $('#username').val() }, В противном случае он будет продолжать проверять первое, что вы указали для входа.
 Jeff Davidson05 июн. 2012 г., 23:28
У меня есть обе эти части точно так же, как и вы, однако проверьте мой код на стороне сервера, приведенный выше, по какой-то причине он не отображает сообщение, в котором отображается css ошибки, но не выводит ошибку.
rules: {
        username: {
            minlength: 6,
            maxlength: 12,
            remote: 'register/isUsernameAvailable',
         }
        }

о всех сил пытался отправить правильный ответ со стороны сервера, если ввод неверен. В конце концов, решение было довольно простым.

Если проверка на стороне сервера возвращает true, вы можете отправить true или & quot; true & quot ;, в противном случае вы можете вернуть любую строку, например & quot; Электронная почта уже существует & quot; или "электронная почта не имеет действительных записей MX". Эта строка будет отображаться в форме сообщения проверки в форме. Единственный улов заключается в том, что строка сообщения, возвращаемая со стороны сервера, должна быть допустимой в формате JSON и должна иметь следующий формат - [& quot; электронная почта уже существует & quot;].

Некоторое объяснение того, как я отладил и нашел решение: Пожалуйста, смотрите ниже удаленный метод в jquery.validate.js. Я добавил операторы журнала и функцию ошибки в вызов ajax для отладки. Когда я вернул обычную строку со стороны сервера, возникла ошибка jQuery.parseJson.

// http://jqueryvalidation.org/remote-method/

remote: function( value, element, param ) {
    if ( this.optional( element ) ) {
        return "dependency-mismatch";
    }

    var previous = this.previousValue( element ),
        validator, data;

    if (!this.settings.messages[ element.name ] ) {
        this.settings.messages[ element.name ] = {};
    }
    previous.originalMessage = this.settings.messages[ element.name ].remote;
    this.settings.messages[ element.name ].remote = previous.message;

    param = typeof param === "string" && { url: param } || param;

    if ( previous.old === value ) {
        return previous.valid;
    }

    previous.old = value;
    validator = this;
    this.startRequest( element );
    data = {};
    data[ element.name ] = value;

    $.ajax( $.extend( true, {
        url: param,
        mode: "abort",
        port: "validate" + element.name,
        dataType: "json",
        data: data,
        context: validator.currentForm,
        success: function( response ) {
            console.log("response is "+response);
            var valid = response === true || response === "true",
                errors, message, submitted;
            console.log("valid is "+valid);
            validator.settings.messages[ element.name ].remote = previous.originalMessage;
            if ( valid ) {
                submitted = validator.formSubmitted;
                validator.prepareElement( element );
                validator.formSubmitted = submitted;
                validator.successList.push( element );
                delete validator.invalid[ element.name ];
                validator.showErrors();
            } else {
                errors = {};
                message = response || validator.defaultMessage( element, "remote" );
                console.log("else message is "+message);
                errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
                validator.invalid[ element.name ] = true;
                console.log("else errors[ element.name ] "+errors[ element.name ]);
                validator.showErrors( errors );
            }
            previous.valid = valid;
            validator.stopRequest( element, valid );
        },
        error: function (xhr, ajaxOptions, thrownError) {
            console.log(xhr.status);
            console.log(thrownError);
        }
    }, param ) );
    return "pending";
}
 17 авг. 2015 г., 17:03
@DileepCK Причина, по которой у вас есть эти комментарии, в том, что ваш вопрос появился в очереди на проверку низкого качества - первый комментарий к вашему сообщению является автоматически сгенерированным, потому что рецензент подумал, что вы былиasking another questionДаже не пытаясь ответить. Есть много людей, которые ошибочно публикуют сообщения типа "У меня тоже есть эта проблема, кто-нибудь еще ее решил?" в поле ответа. Ваш ответ на первый взгляд выглядит так, потому что он начинается с "Мне нужно было ...", поэтому я предложил переписать его.
 16 авг. 2015 г., 19:08
Принятый ответ просто не отвечает тому, что должна возвращать серверная часть, и там также есть комментарий, который говорит, что он не отвечает на вопрос. Я не уверен, почему это было принято в первую очередь.
 15 авг. 2015 г., 19:15
Я думаю, что это пытается быть ответом, но, пожалуйста, уточните свою формулировку, потому что в ее нынешнем виде она выглядит как вопрос - ответ похоронен в вашем потоке сознания.

Ваш ответ на вопрос