1. กิจกรรม
นี่เป็นปัญหาที่ฉันละเลยหรือไม่ได้ค้นพบมานานปัญหามีดังนี้:
ในเพจ เมื่อมีการควบคุมการตรวจสอบ เมื่อตัวควบคุมปุ่มทริกเกอร์เหตุการณ์ OnClientClick และเหตุการณ์นี้ส่งคืนเป็นจริงและเท็จ การควบคุมการตรวจสอบจะกลายเป็นไม่ถูกต้องและจะไม่ทำงานอีกต่อไป คำอธิบายเฉพาะมีดังนี้:
หน้า .Net เป็นดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="เซิร์ฟเวอร์">
</asp:ScriptManager>
<div>
<asp:TextBox ID="TextBoxTest" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID = "RequiredFieldValidator1" runat = "เซิร์ฟเวอร์" ControlToValidate = "TextBoxTest"
ErrorMessage = "ไม่สามารถเว้นว่างได้" Display = "ไม่มี" ></asp: RequiredFieldValidator >< ajaxToolkit: ValidatorCalloutExtender
ID = "ValidatorCalloutExtender1" TargetControlID = "RequiredFieldValidator1" runat = "เซิร์ฟเวอร์">
</ajaxToolkit:ValidatorCalloutExtender>
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="return ยืนยัน('คุณแน่ใจหรือไม่ว่าต้องการส่ง?'); />
</div>
</แบบฟอร์ม>
ดังที่กล่าวข้างต้น ให้เพิ่มการควบคุมการตรวจสอบ RequireFieldValidator ลงในเพจ เพื่อให้ค่าของ TextBoxTest ไม่สามารถเว้นว่างได้ เมื่อ ButtonText ส่งเพจ ผู้ใช้จะถูกขอให้ยืนยันว่าจำเป็นต้องส่งหรือไม่ เป็นหน้าเว็บที่เรียบง่ายและดูเหมือนว่าจะไม่มีปัญหาใดๆ แต่เมื่อค่าของ TextBoxTest ว่างเปล่า การควบคุมการตรวจสอบจะไม่ทำงานและส่งเพจสำเร็จ เหตุผลนี้คืออะไร?
2. ตอบสนองต่อเหตุการณ์
เกิดอะไรขึ้น? ขั้นแรก หลังจากที่ฉันลบเหตุการณ์ OnClientClick ของ ButtonTest การควบคุมการตรวจสอบก็ใช้งานได้ ทำไมเป็นเช่นนี้? ฉันตรวจสอบซอร์สโค้ดของเพจแล้วและพบว่าตัวควบคุม ButtonTest สร้างซอร์สโค้ดต่อไปนี้:
<input type="submit" name="ButtonText" value="Test" onclick="javascript:WebForm_DoPostBackWithOptions(ใหม่ WebForm_PostBackOptions(ButtonText, , true, , , false, false))" id="ButtonText" />
ดังที่เห็นได้จากบรรทัดของซอร์สโค้ดนี้ การควบคุมการตรวจสอบจะสร้างโค้ดจาวาสคริปต์บนฝั่งไคลเอ็นต์เพื่อตรวจสอบว่าค่าในกล่องข้อความว่างเปล่าหรือไม่ หลังจากที่ฉันเพิ่ม OnClientClick ของ ButtonTest ฉันได้ดูซอร์สโค้ดอีกครั้ง ซอร์สโค้ดที่สร้างโดยตัวควบคุม ButtonTest เป็นดังนี้:
<input type="submit" name="ButtonText" value="Test" onclick="return ยืนยัน('คุณแน่ใจหรือไม่ว่าต้องการส่ง?');WebForm_DoPostBackWithOptions(WebForm_PostBackOptions ใหม่ (ButtonText, , true, , , false, false )) " id="ข้อความปุ่ม" />
จากบรรทัดโค้ดนี้ คุณสามารถเห็นได้อย่างชัดเจนว่าปัญหาอยู่ที่ใด ในฝั่งไคลเอ็นต์ จาวาสคริปต์ที่กำหนดเองจะถูกดำเนินการก่อน จากนั้นจาวาสคริปต์ที่สร้างโดยการควบคุมการตรวจสอบจะถูกดำเนินการ เห็นได้ชัดว่าในกรณีนี้ การควบคุมการตรวจสอบจะสูญเสียไป ความหมายใดๆ
3. การควบคุมการตอบสนอง
เมื่อคุณทราบแล้วว่าปัญหาอยู่ที่ใด วิธีแก้ปัญหาของฉันก็จะง่ายขึ้นคือ: ก่อนที่จะดำเนินการจาวาสคริปต์ที่กำหนดเอง (กลับมายืนยัน ('คุณแน่ใจหรือไม่ว่าต้องการส่ง?')) ให้ตรวจสอบว่าการควบคุมบนหน้าเว็บเป็นไปตาม กฎ ดังนั้นฉันจึงแก้ไขเหตุการณ์ OnClientClick ของ ButtonTest ดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="if(CheckClientValidate()) return Confirm('คุณแน่ใจหรือไม่ว่าต้องการส่งเพจ?'); />
รหัสของวิธีการ CheckClientValidate() เป็นดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
<script language="javascript" type="text/javascript">
ฟังก์ชั่น CheckClientValidate(){
Page_ClientValidate();
ถ้า (หน้า_IsValid){
กลับเป็นจริง;
}อื่น{
กลับเท็จ;
-
-
</สคริปต์>
วิ่งทดสอบ การควบคุมการตรวจสอบทำงาน แก้ไขปัญหาแล้ว
4. คำลงท้าย
นี่คือปัญหาและแนวทางแก้ไขที่ฉันรู้ดีว่าเพิกเฉยต่อปัญหานี้ ฉันรู้สึกลำบากใจมาก จากที่นี่ เรายังเห็นความจำเป็นในการระบุการตรวจสอบฝั่งเซิร์ฟเวอร์ที่เข้มงวด :-) ไม่เพียงป้องกัน "แฮกเกอร์" จากการเลี่ยงผ่านการตรวจสอบลูกค้าเท่านั้น แต่ยังป้องกันความไม่ถูกต้องของข้อมูลที่เกิดจากข้อผิดพลาดที่ตนเองไม่ได้สังเกตเห็นอีกด้วย
บันทึก:
Page_ClientValidate() ฟังก์ชันนี้ใช้ในเพจ aspx ที่มีตัวควบคุมการตรวจสอบของ Microsoft เพื่อคืนค่า True หรือ False ขึ้นอยู่กับว่าการดำเนินการป้อนข้อมูลของผู้ใช้นั้นถูกกฎหมายหรือไม่
สามารถตัดสินได้โดยตรง
คัดลอกรหัสรหัสดังต่อไปนี้:
ถ้า(Page_ClientValidate())
-
กลับเป็นจริง;
-
อื่น
-
กลับเท็จ;
-