0

これが私のフォームです (この演習に必要なフィールドのみが含まれています。実際には 20 の入力フィールドがあります)。

<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>

これは、confirm_password フォーム フィールドに入力して終了した後の検証で呼び出される関数 checkUserPass です。

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が返されることはわかっているので、そのユーザーとパスワードの組み合わせを持つユーザーが既に存在します。

ただし、検証メッセージは表示されません。関数呼び出しで検証を行う正​​しい方法に従っていると思います。ユーザー名とパスワードの両方を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."
}

メモを編集します。checkUserPass 関数を更新して、別の関数を正常に呼び出すようにしました。

4

2 に答える 2

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;**
}
于 2012-11-30T19:15:41.763 に答える
0

非同期ajaxを使用しているため、戻り値はどこにも返されません。データを使用して関数を呼び出す必要があります。そして、ajax関数の外でe.preventDefault()(!!!)を使用して送信を防ぐ必要があります。

if(data.result) {
    function_to_validate_the_data(data.result);
} // if(data.result)
于 2012-05-31T15:41:27.550 に答える