2017-02-15 2 views
1

나는 한방의 viewModel을 가지고 있으며 jQuery 유효성 검사를 연결하고 있습니다. 값 중 하나 인 code, 원격 검사가 이미 사용 중인지 확인하고 싶습니다. 문제는 원격 유효성 검사를위한 나의 방법에서, self.code() 호출이 새로운 값 대신 이전 값을 반환한다는 것입니다.넉 아웃 및 jQuery 유효성 검사 원격 : 최신 값을 가져 오지 않음

form.validate({ 
    rules: { 
     'plandetail-code': { 
      required: true, 
      remote: { 
       url: '/Plans/ValidatePlanCode', 
       type: 'POST', 
       data: { 
        id: self.id(), 
        code: self.code() //form.find('[name="plandetail-code"]').val() 
       } 
      } 
     }, 
     'plandetail-name': "required"      
    } 
}); 

관련 HTML : :

<div class="form-group"> 
    <label for="plandetail-code">Code</label> 
    <input type="text" name="plandetail-code" data-bind="textInput: code" class="form-control" /> 
</div> 

내 컨트롤러 -

내 유효성 검사 코드 (같은 결과주의는 또한 아무 소용이 값을 얻기의 "직접적인"방법을 시도) 액션은 간단하지만, 항상 원래 값으로 이 나온다는 점에 유의하십시오.

[HttpPost] 
public string ValidatePlanCode(int? id, string code) { 
    return _service.ValidatePlanCode(id, code) ? "true" : "false"; 
} 

그리고 여기 내 뷰 모델입니다 :

function PlanDetailVM(model) { 

    var self = this; 

    self.originalModel = model; 
    self.form = $('#pgPlan-plan-detail-form'); 

    self.id = ko.observable(model.ID); 
    self.active = ko.observable(model.Active); 
    self.code = ko.observable(model.Code); 
    self.name = ko.observable(model.Name); 
    self.notes = ko.observable(model.notes); 

    self.dirty = ko.computed(function() { return isDirty(); }); 

    self.save = function() { saveChanges(); } 
    self.cancel = function() { cancelChanges(); } 

    ko.applyBindings(self, document.getElementById('pgPlan-detail-container')); 
    initValidation(self.form); 

    return self; 


    function initValidation(form) { 

     form.validate({ 
      rules: { 
       'plandetail-code': { 
        required: true, 
        remote: { 
         url: '/Plans/ValidatePlanCode', 
         type: 'POST', 
         data: { 
          id: self.id(), 
          code: self.code() //form.find('[name="plandetail-code"]').text() 
         } 
        } 
       }, 
       'plandetail-name': "required"      
      } 
     }); 

    } 

    function isDirty() { ... } 

    function saveChanges() { 

     if (!self.form.valid()) { 
      return; 
     } 

     // ajax snipped 
    } 

    function cancelChanges() { ... } 

} 

생식 : 내가하고 saveChanges 방법에 내가 form.valid() 확인 (물론 이후에하는 것이 퍼팅 시도) 바인딩을 적용하기 전에 form.Validate({})을 실행

  • 로드 초기보기를, 코드 BBBB에 값 AAAA에게
  • 변경 코드가
  • 컨트롤러 액션 코드라고 컨트롤러 액션을 준수 param = AAAA

텍스트 입력에서 최신 값을 가져올 수없는 이유가 확실하지 않습니다. 내가 놓친 게 있니? 덕분에

답변

2

rules 즉시 평가하는 object, 그래서 당신이 (이 값이 아닌 기능을 반환 이후)

그래서 당신이 기능

로 사용할 필요가 self.id()를 사용하는 경우 data 객체는 기본 값으로 작성 얻을 것이다
form.validate({ 
    rules: { 
    'plandetail-code': { 
     required: true, 
     remote: { 
     url: '/Plans/ValidatePlanCode', 
     type: 'POST', 
     data: { 
      id: self.id, // function evaluated at runtime 
      code: self.code 
     } 
     } 
    }, 
    'plandetail-name': "required" 
    } 
}); 
+0

거룩한 얼굴 ... 오, 확인 ... 감사합니다. – jleach