2015-04-21 4 views
2

Я использую метод дистанционной проверки и задаю вопросы о следующем разделе http://jqueryvalidation.org/remote-method/.jQuery validator remote method

Ответ оценивается как JSON и должен быть истинным для действительных элементов и может быть любым false, undefined или null для недопустимых элементов, используя сообщение по умолчанию; или строки, например. «Это имя уже принято, попробуйте peter123 вместо», чтобы отобразить его как сообщение об ошибке.

Если сервер echo('custom error');, он не проходит проверку, но ошибка не отображается. Почему нет?

Если сервер выполняет echo(null); или echo(false); или вообще не имеет эха, клиент не получает ответа, он не проходит проверку, и сообщение по умолчанию не отображается. Не следует ли отображать сообщение по умолчанию? Аналогично, если сервер выполняет echo('undefined');, клиент получает «undefined», но сообщение по умолчанию не отображается.

Сервер Script

<?php 
    header('Content-Type: text/plain;'); 

    //The following passes validation 
    //echo('true'); 

    //The following results in the client receiving 1, and "1" is displayed as error 
    //echo(true); 
    //echo(1); 
    //echo('1'); 

    //The following will trigger the default message 
    //echo(0); 
    //echo('null'); 
    //echo('false'); 
    //echo('0'); 

    //The following results in no ajax response to client, and no message is displayed. 
    //Doesn't this result in client getting undefined which should display the default message 
    //echo(null); 
    //echo(false); 
    //no echo at all 

    //Client receives "undefined", but it doesn't display the default message. Shouldn't it? 
    //echo('undefined'); 

    //Client receives "custom error", but it doesn't display this text. Shouldn't it? 
    echo('custom error'); 
?> 

Client Script

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
     <title>Testing</title> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.js" type="text/javascript"></script> 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.13.1/jquery.validate.js" type="text/javascript"></script> 
     <script type="text/javascript"> 
      $(function(){ 
       var validator=$("#myForm").validate({ 
        rules: { 
         bla: { 
          minlength:2, 
          maxlength:4, 
          required:true, 
          remote: {url:"validate.php",type:'get',data:{a:1,b:2,c:3}} 
          //remote: "validate.php" 
         } 
        }, 
        messages: { 
         bla: { 
          remote:"default message" 
         } 
        } 
       }); 
      }); 
     </script> 
    </head> 

    <body> 
     <form id="myForm" method="post"> 
      <input name="bla" id="bla" value=""> 
      <input type="submit" value="submit"> 
     </form> 
    </body> 
</html> 
+0

Поскольку существует слишком много вопросов относительно путаницы с использованием метода 'remote', I * почти * закрыл это как дубликат [this] (http://stackoverflow.com/q/16577120/594235) , Тем не менее, ваш немного более конкретный и, возможно, * может быть использован в будущем, чтобы закрыть других. – Sparky

ответ

4

«Если сервер эхо ('пользовательские ошибки') ;, он не проходит проверку, но не отображается ошибка. Почему нет?"

Потому что вам нужно отправить ответ сервера как строку JSON; не регулярная строка, а не логическая.

echo json_encode('this is going to be the error message'); 

Это собирается пройти проверку ...

echo json_encode('true'); 

Это происходит сбой проверки и использовать по умолчанию сообщение ...

echo json_encode('false'); 

Они также будут работать как указано выше ...

echo 'true' // pass 
echo 'false' // fail using default message 

Это не будет работать ...

echo 'custom message'; 

// следующие результаты в клиенте, получающего 1, а "1" отображается как ошибка [надрез] ....

Docs:

«ответ оценивается как JSON и должно быть ... любая ложь, недеформированной штраф или нуль для поврежденных элементов»

Что-нибудь не интерпретируется как строка, содержащая "true", будет не прошедших проверку. Поскольку вы не повторяете эти ответы как JSON, ваши различные сообщения об ошибках оказались очень непредсказуемыми.

Да, я согласен, что документация немного неоднозначна в отношении формулировки JSON. «оценивается как JSON», по-видимому, подразумевает, что плагин выполняет преобразование. Это не тот случай. Ответ сервера должен быть уже JSON при его оценке.


type:'get' 

GET уже по умолчанию для метода remote и не должны быть указаны.


Я создал pull request, чтобы получить документацию изменилось в этом:

Ответ на стороне сервера должен быть строкой в ​​формате JSON, который должен быть "true" для действительных элементов, и может быть "false", undefined или null для недопустимых элементов, используя сообщение об ошибке по умолчанию. Если ответ serverside является строкой, например. "That name is already taken, try peter123 instead", эта строка будет отображаться в качестве настраиваемого сообщения об ошибке вместо значения по умолчанию.

+1

Это сводило меня с ума! Спасибо – user1032531

+0

@ user1032531, я думаю, что у многих людей есть проблемы просто из-за формулировки из документации. Я предложил внести изменения в документы, как описано в моем правлении выше. Не стесняйтесь прокомментировать это в [потоке GitHub] (https://github.com/jzaefferer/validation-content/pull/12). Благодарю. – Sparky