1. 이벤트
이는 오랫동안 무시하거나 발견하지 못한 문제입니다. 문제는 다음과 같습니다.
페이지에 유효성 검사 컨트롤이 있는 경우 Button 컨트롤이 OnClientClick 이벤트를 트리거하고 이 이벤트가 true 및 false를 반환하면 유효성 검사 컨트롤이 유효하지 않게 되어 더 이상 작동하지 않습니다. 구체적인 설명은 다음과 같습니다.
.Net 페이지는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
<form id="form1" runat="서버">
<asp:ScriptManager ID="ScriptManager1" runat="서버">
</asp:스크립트매니저>
<div>
<asp:TextBox ID="TextBoxTest" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="서버" ControlToValidate="TextBoxTest"
ErrorMessage="비워둘 수 없습니다" Display="None"></asp:RequiredFieldValidator><ajaxToolkit:ValidatorCalloutExtender
ID="ValidatorCalloutExtender1" TargetControlID="RequiredFieldValidator1" runat="서버">
</ajaxToolkit:ValidatorCalloutExtender>
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="return verify('제출하시겠습니까?') />
</div>
</form>
위와 같이 TextBoxTest의 값이 비어 있을 수 없도록 페이지에 RequireFieldValidator 유효성 검사 컨트롤을 추가합니다. ButtonText가 페이지를 제출하면 사용자에게 페이지를 제출해야 하는지 확인하라는 메시지가 표시됩니다. 매우 간단한 페이지이고 문제가 없는 것 같습니다. 그러나 TextBoxTest 값이 비어 있으면 유효성 검사 컨트롤이 작동하지 않고 페이지가 성공적으로 제출됩니다. 그 이유는 무엇입니까?
2. 이벤트에 응답하기
무슨 일이야? 먼저 ButtonTest의 OnClientClick 이벤트를 제거한 후 확인 제어가 작동했습니다. 왜 이런가요? 페이지의 소스 코드를 확인한 결과 ButtonTest 컨트롤이 다음 소스 코드를 생성하는 것으로 나타났습니다.
<input type="submit" name="ButtonText" value="Test" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(ButtonText, , true, , , false, false))" id="ButtonText" />
이 소스 코드 줄에서 볼 수 있듯이 유효성 검사 컨트롤은 클라이언트 측에서 JavaScript 코드 조각을 생성하여 TextBox의 값이 비어 있는지 확인합니다. ButtonTest의 OnClientClick을 추가한 후 소스 코드를 다시 검토했습니다. ButtonTest 컨트롤에 의해 생성된 소스 코드는 다음과 같습니다.
<input type="submit" name="ButtonText" value="테스트" onclick="return verify('제출하시겠습니까?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(ButtonText, , true, , , false, false )) " id="ButtonText" />
이 코드 줄에서 문제가 있는 위치를 명확하게 확인할 수 있습니다. 클라이언트 측에서는 사용자 정의 자바스크립트가 먼저 실행된 다음 유효성 검사 컨트롤에 의해 생성된 자바스크립트가 실행됩니다. 분명히 이 경우 유효성 검사 컨트롤이 손실됩니다. 어떤 의미라도.
3. 대응 통제
문제가 어디에 있는지 알면 해결하기가 더 쉬울 것입니다. 사용자 정의 자바스크립트를 실행하기 전에(return 확인('제출하시겠습니까?')) 페이지의 컨트롤이 다음을 준수하는지 확인하세요. 규칙을 따르므로 ButtonTest의 OnClientClick 이벤트를 다음과 같이 수정했습니다.
다음과 같이 코드 코드를 복사합니다.
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="if(CheckClientValidate()) returnConfirm('페이지를 제출하시겠습니까?');"
CheckClientValidate() 메서드의 코드는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
<스크립트 언어="자바스크립트" 유형="텍스트/자바스크립트">
함수 CheckClientValidate(){
Page_ClientValidate();
if (Page_IsValid){
사실을 반환;
}또 다른{
거짓을 반환;
}
}
</script>
실행하고 테스트하세요. 유효성 검사 제어가 작동합니다. 문제가 해결되었습니다.
4. 추신
이것이 제가 알고 있던 문제이자 해결책인데, 이 문제를 발견했을 때 저는 식은땀을 흘렸습니다. 다행스럽게도 엄격한 서버측 검증을 수행했습니다. 여기에서 엄격한 서버 측 확인을 지정하는 것이 얼마나 필요한지 확인할 수도 있습니다. :-). 이는 "해커"가 클라이언트 확인을 우회하는 것을 방지할 뿐만 아니라 스스로 인지하지 못한 오류로 인해 발생하는 데이터 부정확성을 방지합니다.
메모:
Page_ClientValidate(), 이 함수는 사용자 입력 작업이 적법한지 여부에 따라 True 또는 False를 반환하기 위해 Microsoft 유효성 검사 컨트롤이 포함된 aspx 페이지에서 사용됩니다.
직접 판단할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
if(Page_ClientValidate())
{
사실을 반환;
}
또 다른
{
거짓을 반환;
}