2012-03-25 2 views
1

내가 가진 시나리오 중 하나에서 필드가 다시 입력되지 않도록 원격 유효성 검사를 수행해야합니다.ASP.NET MVC 3의 수동 원격 유효성 검사

이것은 ASP.NET MVC 3 원격 검증을 사용하여 수행 할 수

그러나, 이것은하지 편집 기록에 사용되는 형태로,에게 레코드를 생성 에 사용되는 형태로 완벽하게 작동 그렇지 않으면 레코드가 이미 존재한다는 오류가 항상 발생합니다.

그래서이 편집 양식에 필요한 것은 ID/이름 열을 보내어 같은 이름의 다른 레코드의 존재를 확인합니다. 즉, 'ID가 아닌 다른 레코드'가 있습니까? 같은 "이름"?

서버 측 로직이 완벽하게 작동합니다. 문제는 jQuery UI 대화 상자에서 오류를 표시하는 것입니다. 나는 jquery.validate.unobstrusive.js와 같은 방법을 사용했다. 다음과 같이

 

    $(document).ready(function() { 
     RemoteValidate({ 
      formName: "CultureEditForm", 
      inputName: "Name", 
      inputId: "CultureId", 
      url: "/Culture/CultureEditNameExists", 
      dupTmpl: "dupTmpl" 
     }); 
    }); 
    

RemoteValidate() 함수 :

는 는 는
 
RemoteValidate = function (options) {  
    $('#' + options.formName + ' input[name=\"' + options.inputName + '\"]').live('blur', function() { 
     var params = { 
      name: $('#' + options.formName + ' input[name=\"' + options.inputName + '\"]').val(), 
      id: $('#' + options.formName + ' input[id$=\"' + options.inputId + '\"]').val() 
     } 

     $.ajax({ 
      url: options.url, 
      type: "POST", 
      data: JSON.stringify(params, null, 2), 
      contentType: "application/json; charset=utf8", 
      dataType: "json", 
      success: function (response) { 
       if (!response) { 
        _onError(options.formName, options.inputName); 
       } 
       else { 
        _onSuccess(options.formName, options.inputName); 
       } 
      } 
     });   
    }); 

    function _onError(formId, inputElement) { 
     var container = $('#' + formId).find("[data-valmsg-for='" + inputElement + "']"), 
      replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false; 

     container.removeClass("field-validation-valid").addClass("field-validation-error"); 

     if (replace) { 
      container.empty(); 
      $('Name already exists').appendTo(container); 
     } 
    } 

    function _onSuccess(formId, inputElement) { 
     var container = $('#' + formId).find("[data-valmsg-for='" + inputElement + "']"), 
      replace = $.parseJSON(container.attr("data-valmsg-replace")); 

     if (container) { 
      container.addClass("field-validation-valid").removeClass("field-validation-error"); 

      if (replace) { 
       container.empty(); 
      } 
     } 
    } 
} 

은 긴 대화 창이 열려, 나는 노력을 계속보기 자체에

, 나는 다음을 실행하고 값을 가져오고 "표시/숨기기"오류 메시지가 작동합니다.

그러나 대화 상자를 닫은 다음 편집 할 다른 레코드를 클릭하면 새 값으로 대화 상자가 다시 열립니다. 단, 서버에 레코드가 데이터베이스에 있는지 확인하는 요청을 보내려고하면 IT 보낸 사람 이전에 편집 한 레코드의 데이터

위의 굵은 글씨체는 서버로 보낼 개체를 준비합니다.

어떤 도움이 필요합니까?

감사합니다.

답변

0

동적 뷰 또는 기타 HTML 콘텐츠 처리는 항상 특수한 것으로 간주되며 민감합니다. 이벤트 핸들러 내부에서 데이터 필드에 액세스하는 방식을 변경해야했습니다.

jQuery는 항상로드 된 첫 번째 HTML보기의 이전 값을 읽었습니다.

 
     $('.rm-field').live('blur', function() { 
     if ($(this).next()) { 
      var params = { 
       name: $(this).val(), id: $('input:last-child', $(this).parents('form')).val() 
      } 

      var element = $(this); 
      var container = $(this).next(); 
      var url = element.parents('form').attr('data-rm-url'); 

      $.ajax({ 
       url: url, 
       type: "POST", 
       data: JSON.stringify(params, null, 2), 
       contentType: "application/json; charset=utf8", 
       dataType: "json", 
       success: function (response) { 
        if (!response) { 
         if (container) { 
          container.removeClass("field-validation-valid").addClass("field-validation-error"); 
          container.empty(); 
          $('Name already exists').appendTo(container); 
         } 
        } 
        else { 
         if (container) { 
          container.addClass("field-validation-valid").removeClass("field-validation-error"); 
          container.empty(); 
         } 
        } 
       } 
      }); 
     } 
    }); 

그때 그것을에 연결된 모든 입력 필드에 클래스 .RM 필드를 추가했다 : 표시되지는 동적하고보기에 관련 데이터를 읽으려면, 나는 다음과 같은 써야했다 blur 이벤트, 그 후 입력 필드의 값을 잡을 수있었습니다.

또한 숨겨진 필드 cultureId에 액세스해야하지만 jQuery는 첫 번째 HTML보기에 계속 액세스하므로 좋지 않습니다. 대신에 parents() 탐색 선택기를 사용하여 양식에 도달 한 다음 편집중인 레코드의 ID가있는 숨겨진 필드 인 내 마지막 아이를 가져옵니다.

그 후 오류 메시지를 추가/제거하는 간단한 DOM 조작.

HTH, 감사합니다.

관련 문제