2014-11-06 2 views
0

ASP MVC 프로젝트 및 jQuery 클라이언트 측 유효성 검증에 문제점이 있습니다. 문제는 제출 단추를 누를 때 양식의 유효성을 검사하지만 오류가 표시되지 않고 양식이 제출된다는 것입니다. 이 문제는 유효성 검사 메서드 내에서 valid()를 호출 할 때만 나타납니다. 예 : 확인 방법 이후에 isdatebefore 및 isdate가 있습니다. #end가 #end 전에 있는지 확인하고 싶습니다. #start의 유효성을 검사 할 때 #end에서 validate를 호출하여 두 요소에서 오류 메시지가 나타나거나 사라지는 지 확인합니다. 유효성 검사 onfocusout을 추가했는데 이것은 #start 및 #ejnd 필드와 양식의 다른 모든 필드에서 올바르게 작동합니다. 그러나 제출 버튼을 누르면 양식이 유효화됩니다 (메소드가 호출되는지 확인하기 위해 일부 중단 점 배치). 오류가 있지만 제출됩니다. 코드가 onfocusout 이벤트와 함께 잘 작동ASP MVC jQuery 유효성 검사 onfocusout 작동, 양식 제출 없음

// Add IsDateAfter validation 
$.validator.addMethod("isdateafter", function (value, element, params) { 
    var self = $(element); 
    var parts = element.name.split("."); 
    var prefix = ""; 
    for (var i = 0; i < parts.length - 1; i++) 
     prefix = parts[i] + "."; 
    var otherElement = $('input[name="' + prefix + params.propertytested + '"]'); 
    var startdatevalue = otherElement.val(); 
    if (!value || !startdatevalue) 
     return true; 
    var allowequal = params.allowequaldates.toLowerCase() === "true"; 
    var start = Globalize.parseDate(startdatevalue); 
    var end = Globalize.parseDate(value); 
    if (!self.data('reval')) { 
     self.data('reval', true); 
     otherElement.data('reval', true); 
     otherElement.valid(); 
     self.data('reval', false); 
     otherElement.data('reval', false); 
    } 
    var isValid = allowequal ? start <= end : 
     start < end; 
    if (isValid) { 
     self.removeClass('input-validation-error'); 
    } 
    return isValid; 
}); 

$.validator.unobtrusive.adapters.add(
    'isdateafter', ['propertytested', 'allowequaldates'], function (options) { 
     options.rules['isdateafter'] = options.params; 
     options.messages['isdateafter'] = options.message; 
    }); 

// Add IsDateBefore validation 
$.validator.addMethod("isdatebefore", function (value, element, params) { 
    var self = $(element); 
    var parts = element.name.split("."); 
    var prefix = ""; 
    for (var i = 0; i < parts.length - 1; i++) 
     prefix = parts[i] + "."; 
    var otherElement = $('input[name="' + prefix + params.propertytested + '"]'); 
    var startdatevalue = otherElement.val(); 
    if (!value || !startdatevalue) 
     return true; 
    var allowequal = params.allowequaldates.toLowerCase() === "true"; 
    var start = Globalize.parseDate(startdatevalue); 
    var end = Globalize.parseDate(value); 
    if (!self.data('reval')) { 
     self.data('reval', true); 
     otherElement.data('reval', true); 
     otherElement.valid(); 
     self.data('reval', false); 
     otherElement.data('reval', false); 
    } 
    var isValid = allowequal ? start >= end : 
     start > end; 
    if (isValid) { 
     $(element).removeClass('input-validation-error'); 
    } 
    return isValid; 
}); 

$.validator.unobtrusive.adapters.add(
    'isdatebefore', ['propertytested', 'allowequaldates'], function (options) { 
     options.rules['isdatebefore'] = options.params; 
     options.messages['isdatebefore'] = options.message; 
    }); 

하지만 원 총리는 태그의 onsubmit 이벤트 내에서 호출 문제가있다 :

여기 내 코드입니다. otherElement.valid()에 대한 호출을 제거 할 때; 모든 것이 다시 작동합니다 (그러나 올바르게 작동하려면 다른 요소의 유효성을 검사해야합니다).

그래서 아무도 내가 하나의 유효성을 검사 할 때 두 요소의 유효성을 검사 할 수있는 방법을 알고 있고 여전히 제출에 실패하지 않았습니까?

+0

양식을 어떻게 제출합니까? – chiapa

+0

간단한 버튼 사용 : wertzui

+0

'을 사용해 보셨습니까? 'validateForm()'함수에서 폼의 유효성을 확인할 수 있습니다. – chiapa

답변

1

.valid() 메서드를 다른 jQuery 유효성 검사 메서드 내에서 사용할 수 없습니다.

Use .element() instead ...

$('#yourForm').validate().element(otherElement); 

또는 플러그인의 자신의 방법 내에서 validator 객체를 나타내는 사용 키워드 this, ...

this.element(otherElement); 

또는 이미 작업으로 확인한로 (키워드가 작동하는 경우 다소 반복적입니다. ...

otherElement.parents('form').validate().element(otherElement); 
+0

올바른 방향으로 나를 가리켜 주셔서 감사합니다! 그러나 otherElement.parents ('form')를 호출해야합니다. validate() .lement (otherElement); 요소 메소드는 양식에 첨부 된 유효성 검사기의 구성원이므로 대답을 편집하면 기꺼이 받아 들일 것입니다. :) – wertzui

+0

@wertzui, 맞습니다. 물론 맞습니다. 방금 테스트 한 결과,'this' 키워드는 메서드 내에서'validator' 객체를 나타냅니다. – Sparky

+0

다시 한 번 보았을 때,'this.element (otherElement);를 사용하여'this.prepareElement (element);를 호출하고 this.reset();을 호출한다는 사실을 알게되었습니다. 그래서 이것은 'this.reset();'가 this.errorList를 지울 것이기 때문에 이전에 검증 된 필드 (예전의 HTML 마크 업에서)가 유효하지 않은 것으로 표시되었을 때 제출시 유효성 검사를 깰 것입니다. 그래서'this.element (otherElement);를 사용하는 대신'this.check (otherElement);를 사용해야합니다. – wertzui

관련 문제