2012-05-31 3 views
0

Вот моя форма (она содержит только поля, необходимые для этого упражнения, Есть на самом деле 20 полей ввода):JQuery ValidationEngine проблема проверки функции

<form id="reg_form" action="/register_submit" method="post"> 
    <fieldset> 
     <ul class="form-list"> 
     <li> 
      <div style="width:500"> 
      <label for="Username" class="required">Username (5 characters minimum,<br />Only Letters, Numbers, '~', '%', '.', ':', '-' and '_' allowed)<em>*</em></label><br /> 
      <div class="input-box"> 
       <input type="text" name="Username" id="Username" value="{embed:Username}" title="Username" class="validate[required,minSize[5],custom[onlyLetNumSpec]] register_input" /> 
      </div> 
      </div> 
     </li> 
     <li id="register-customer-password"> 
      <div style="width:500"> 
      <label for="Password" class="required">Password (5 characters minimum,<br />Only Letters, Numbers, '~', '%', '.', ':', '-' and '_' allowed)<em>*</em></label><br /> 
      <div class="input-box"> 
       <input type="Password" name="Password" id="Password" title="Password" class="validate[required,minSize[5],custom[onlyLetNumSpec]] register_input" /> 
      </div> 
      </div> 
      <br /> 
      <div style="width:500"> 
      <label for="confirm_password" class="required">Confirm Password<em>*</em></label> 
      <div class="input-box"> 
       <input type="password" name="confirm_password" title="Confirm Password" id="confirm_password" class="validate[required,custom[onlyLetNumSpec],equals[Password],funcCall[checkUserPass]] register_input" /> 
      </div> 
      </div> 
      <div class="clear"></div> 
     </li> 
     </ul> 
     <div class="button-set"> 
     <button class="button button-login" title="Create Account" type="submit"> 
      <span> 
      <span>Create Account</span> 
      </span> 
     </button> 
     </div> 
    </fieldset> 
</form> 

Теперь это функция checkUserPass, что называется на проверки после того, как поле формы confirm_password заполнена и вышла:

function checkUserPass(field, rules, i, options){ 
    $.ajax({type:'POST', 
      url: '/json_api/ParticipantSelectByUser/', 
      data: {"Username":$("#Username").val(), "Password":$("#Password").val()}, 
      dataType: 'json', 
      success: checkUserPassResult, 
      error:function (xhr, ajaxOptions, thrownError){ 
       alert(xhr.status); 
       alert(thrownError); 
      } // error 
    }); 
} 

function checkUserPassResult(data) { 
    if(data.result.ParticipantID > 0) { 
    /*--- There is already a user with this combination ---*/ 
    return options.allrules.checkUserPass.alertText; 
    } // if(data.result) 
} 

Я ЗНАТЬ что есть data.result возвращается, и как таковой, уже есть пользователь с этим пользователем/PWD комбинации.

Тем не менее, сообщения о подтверждении не отображаются. Я полагаю, что я выполнил правильный способ проверки с помощью вызова функции. Я не могу использовать правило проверки ajax из-за необходимости передавать имя пользователя и пароль для вызова ajax. В чем проблема? Все мои другие проверки в этой форме работают очень хорошо.

Вот пользовательские правила, необходимые для вышеуказанных проверок:

"onlyLetNumSpec": { 
    // Good for database fields 
    "regex": /^[0-9a-zA-Z_-~%.:]+$/, 
    "alertText": "* Only Letters, Numbers, tilde(~), pct(%), period(.), colon(:), hyphen(-) and underscore(_) allowed" 
}, 
"checkUserPass": { 
    "alertText": "* A User with the same Username and/or Password has been detected. Please change one of the entries." 
} 

Edit Note; Я обновил функцию checkUserPass, чтобы успешно выполнить еще один funstion.

ответ

0

Вы используете async ajax, поэтому возвращаемое вами значение не возвращается. Вам нужно будет вызвать функцию с вашими данными. И вы должны будете предотвратить отправку с помощью e.preventDefault() (!!!) вне функции ajax.

if(data.result) { 
    function_to_validate_the_data(data.result); 
} // if(data.result) 
+0

Но переменная данных в функции успеха У данных есть данные. – MB34

+0

Демонстрация вызова функции не сказала, чтобы вернуть true или false, только alertText. – MB34

+0

Звонок ajax - асинхронный. Эта функция ничего не вернет, потому что она вызывает ajax и ничего больше. Вы должны будете вернуть false вне вызова ajax и работать с данными в новой функции. Может быть, эта ссылка поможет понять http://arshadinfo.wordpress.com/2008/05/25/what-is-the-difference-between-asynchronous-ajax-and-synchronous-request/ – Oliver

1

Ok. Я нашел решение! Все, что вам нужно сделать, это вернуться от основной функции, а не обратно.

function checkUserPass(field, rules, i, options){ 
var ret = ""; 
$.ajax({type:'POST', 
    url: '/json_api/ParticipantSelectByUser/', 
    data: {"Username":$("#Username").val(), "Password":$("#Password").val()}, 
    dataType: 'json', 
    async: false, 
    success: function(response) 
    { 
    if(data.result.ParticipantID > 0) 
     { 
      ret = "There is already a user with this combination"; 
     } 

    }, 
    error:function (xhr, ajaxOptions, thrownError){ 
     alert(xhr.status); 
     alert(thrownError); 
    } // error 
}); 

**return ret;** 
} 
+0

Это вернет пустую строку в большинстве случаев (если ответ ajax не будет очень быстрым, возможно, только на localhost ...) – bfavaretto

+0

@bfavaretto, вы правы. Я попробовал это после развертывания и должен был внести изменения, чтобы сделать синхронный вызов ajax. – JaganY

Смежные вопросы