2011-11-03 5 views
1

사용자 정의가 눈에 잘 띄지 않는 유효성 검사를 만드는 데 상당히 익숙하며 기묘한 문제가 발생합니다.MVC 사용자 정의 눈에 띄지 않는 유효성 검사 항상 메시지 표시

이 유효성 검사는 기본적으로 Ajax를 통해 데이터베이스를 검사하여 모델과 일련 번호 조합이 이미 존재하는지 확인합니다. jQuery와 Ajax는 예상대로 작동하는 것 같지만 유효성 검사 함수가 호출되는 즉시 유효성 검사 메시지가 나타납니다. 여기

내 jQuery를하다 :

여기
$.validator.addMethod('newserialandmodel', 
    function (value, element, parameters) { 
     var modelNumber = $('#ProductInformation_ModelNumber').val(); 
     var serialNumber = value; 

     var token = $('input[name=__RequestVerificationToken]').val(); 

     $.ajax({ 
      type: "POST", 
      url: "/ajax/getmodelandserialexists/", 
      data: ({ 
        modelNumber: modelNumber, 
        serialNumber: serialNumber, 
        '__RequestVerificationToken': token 
        }), 
      cache: true, 
      dataType: 'json', 
      success: function (response) { 
       if (response.exists) { 
        $.validator.messages.newserialandmodel = 
         $.format($.validator.messages.newserialandmodel); 
       } 

       return !response.exists; 
      } 
     }); 

     return false; 
    } 
); 

$.validator.unobtrusive.adapters.add(
    'newserialandmodel', 
    function (options) { 
     options.rules['newserialandmodel'] = options.params; 

     if (options.message != null) { 
      $.validator.messages.newserialandmodel = options.message; 
     } 
    } 
); 

양식 요소 모습입니다 같은 :

<input type="text" value="" 
name="ProductInformation.SerialNumber" id="ProductInformation_SerialNumber" 
data-val-required="The Serial number field is required." 
data-val-newserialandmodel="There is already a contract with the provided model and serial numbers." 
data-val-length-max="30" 
data-val-length="The 30 field requires no more than 30 characters." 
data-val="true" class="input-validation-error"> 

는 검증의 첫 번째 줄 안타 내가 곧 통해 단계의 이미 표시된 메시지 :

제공된 모델 및 일련 번호로 이미 계약을 맺고 있습니다.

또한 함수가 true를 반환하더라도 메시지가 남아 있습니다.

나머지 기능/Ajax는 정상적으로 작동하지만 왜이 메시지가 즉시 표시되는지, 그리고 내가 사실을 반환 할 때 왜 그 메시지가 그대로 남아 있는지 알 수 있습니다.

어떤 일이 벌어지고 있는지 알 수 있습니까?

답변

1

그레그와 제로의 답변 덕분에, 나는 더 많은 반환 값을 가지고 놀 수있게되었습니다.

문제점은 Ajax 성공 함수 내의 return이 유효성 검사 기능이 아닌 성공 함수로 응답을 리턴한다는 점입니다. 그래서 Ajax 성공 함수 내에서 값을 설정하고 반환해야합니다.

async: false을 포함해야한다는 점도 유의해야합니다. 그렇지 않으면 Ajax 호출이 완료되기 전에 유효성 검사 함수가 반환됩니다 (기본값은 false).

$.validator.addMethod('newserialandmodel', 
    function (value, element, parameters) { 
     var modelNumber = $('#ProductInformation_ModelNumber').val(); 
     var serialNumber = value; 

     var token = $('input[name=__RequestVerificationToken]').val(); 

     var isValid = false; 

     $.ajax({ 
      type: "POST", 
      url: "/ajax/getmodelandserialexists/", 
      data: ({ 
        modelNumber: modelNumber, 
        serialNumber: serialNumber, 
        '__RequestVerificationToken': token }), 
      async: false, 
      dataType: 'json', 
      success: function (response) { 
       if (response.exists) { 
        $.validator.messages.newserialandmodel = 
         $.format($.validator.messages.newserialandmodel); 
       } 

       isValid = !response.exists; 
      } 
     }); 

     return isValid; 
    } 
); 
1

나는 함수의 끝에서 false을 반환하기 때문에 생각합니다. 따라서 함수는 false를 반환하고 success 콜백은 true을 반환하려고 시도하지만 너무 늦기 때문에 false이 이미 유효성 검사기로 반환되었습니다. 간단한 해결책은 async: false을 사용하여 AJAX 호출을 동 기적으로 호출하는 것입니다.

+0

+1 이것은 올바른 길로 인도했습니다.'success' 응답은 검증 기능에 응답하지 않았기 때문에 기본적으로 무시되었습니다. 그러나 성공 함수입니다. 수정에 대한 내 대답을 참조하십시오. –

0

추측의 몇 :

당신은이
  1. "캐시 : true"로, URL이 동일한 경우는 서버에서 가져 오기되지 않습니다. 캐싱이 POST 된 매개 변수를 검사하는지 여부는 알 수 없으므로 다른 매개 변수를 사용하더라도 캐싱 된 버전을 사용할 수 있습니다. 캐시를 false로 설정하십시오.

  2. 어댑터 API에 익숙하지 않지만 이전 활동으로 인해 조건이 충족 될 수 있습니까? (이 옵션은 실제로 실행될 때 null이 아님)?

관련 문제