การยืนยันลูกค้า
หากหน้าของคุณเปิดใช้งานการรับรองความถูกต้องของไคลเอนต์จะมีลำดับเหตุการณ์ที่แตกต่างอย่างสิ้นเชิงในระหว่างการเดินทางไปกลับ การรับรองความถูกต้องของไคลเอนต์ถูกนำมาใช้โดยใช้ไคลเอนต์JScript® ไม่จำเป็นต้องใช้ส่วนประกอบไบนารีเพื่อดำเนินการตรวจสอบนี้
แม้ว่าภาษา JScript นั้นได้มาตรฐานอย่างดี แต่ก็ไม่มีมาตรฐานที่นำมาใช้อย่างกว้างขวางสำหรับโมเดลวัตถุเอกสาร (DOM) ที่ใช้ในการโต้ตอบกับเอกสาร HTML ในเบราว์เซอร์ ดังนั้นการรับรองความถูกต้องของลูกค้าจะดำเนินการเฉพาะใน Internet Explorer 4.0 และในภายหลังเนื่องจากวัตถุการตรวจสอบความถูกต้องเป็น Internet Explorer DOM
จากมุมมองของเซิร์ฟเวอร์การตรวจสอบไคลเอนต์หมายความว่าการควบคุมการตรวจสอบจะส่งเนื้อหาที่แตกต่างไปยัง HTML นอกเหนือจากนั้นลำดับเหตุการณ์ของมันก็เหมือนกันทุกประการ การตรวจสอบฝั่งเซิร์ฟเวอร์ยังคงดำเนินการอยู่ แม้ว่ามันอาจดูเหมือนซ้ำซ้อน แต่ก็สำคัญมากเพราะ:
การควบคุมการตรวจสอบบางอย่างอาจไม่รองรับสคริปต์ของลูกค้า มีตัวอย่างที่ดี: หากคุณต้องการใช้ทั้งฟังก์ชั่นการตรวจสอบ CustomValidator และ Server แต่ไม่มีฟังก์ชั่นการตรวจสอบไคลเอนต์
ข้อควรระวังด้านความปลอดภัย บางคนสามารถรับหน้าด้วยสคริปต์ได้อย่างง่ายดายแล้วปิดการใช้งานหรือเปลี่ยนหน้านั้น คุณไม่ควรใช้สคริปต์เพื่อป้องกันไม่ให้ข้อมูลที่ไม่ดีเข้าสู่ระบบของคุณ แต่เพียงเพื่อรับการตอบรับที่เร็วขึ้นจากผู้ใช้ ดังนั้นหากคุณต้องการใช้ CustomValidator คุณไม่ควรให้ฟังก์ชั่นการตรวจสอบไคลเอนต์โดยไม่ต้องใช้ฟังก์ชั่นการตรวจสอบเซิร์ฟเวอร์ที่สอดคล้องกัน
การควบคุมการตรวจสอบแต่ละครั้งทำให้มั่นใจได้ว่าบล็อกสคริปต์ไคลเอนต์มาตรฐานจะถูกส่งไปยังหน้า ที่จริงแล้วนี่เป็นเพียงส่วนเล็ก ๆ ของรหัสที่มีการอ้างอิงถึงรหัสในสคริปต์ไลบรารี webuivalidation.js ไฟล์ไลบรารีสคริปต์นี้มีตรรกะทั้งหมดสำหรับการตรวจสอบไคลเอนต์
เกี่ยวกับไลบรารีสคริปต์
เนื่องจากสคริปต์การควบคุมเว็บการตรวจสอบอยู่ในไลบรารีสคริปต์จึงไม่จำเป็นต้องส่งรหัสที่ผ่านการตรวจสอบไคลเอนต์ทั้งหมดโดยตรงไปยังหน้าแม้ว่าดูเหมือนว่าจะทำบนพื้นผิว การอ้างอิงไฟล์สคริปต์หลักมีลักษณะเช่นนี้:
<ภาษาสคริปต์ = "JavaScript"
src = "/_ aspx/1.0.9999/script/webuivalidation.js"> </script>
โดยค่าเริ่มต้นไฟล์สคริปต์จะถูกติดตั้งในไดเรกทอรีรูทเริ่มต้นในไดเรกทอรี "_aspx" และเรียกด้วยสคริปต์ที่เกี่ยวข้องกับรูทรวมถึง Directive ซึ่งเริ่มต้นด้วยสแลชไปข้างหน้า การอ้างอิงนี้บ่งชี้ว่าแต่ละวัตถุแต่ละวัตถุไม่จำเป็นต้องมีไลบรารีสคริปต์และหน้าทั้งหมดในคอมพิวเตอร์เดียวกันสามารถอ้างอิงไฟล์เดียวกันได้ คุณจะสังเกตเห็นว่ายังมีหมายเลขเวอร์ชันรันไทม์ภาษาทั่วไปในเส้นทางนี้เพื่อให้รุ่นรันไทม์ที่แตกต่างกันสามารถทำงานบนคอมพิวเตอร์เครื่องเดียวกันได้
หากคุณดูไดเรกทอรีรูทเสมือนจริงเริ่มต้นคุณจะพบไฟล์และดูเนื้อหาของมัน ระบุตำแหน่งของไฟล์เหล่านี้ในไฟล์ config.web ไฟล์ config.web เป็นไฟล์ XML สำหรับการตั้งค่า ASP+ ส่วนใหญ่ ต่อไปนี้เป็นคำจำกัดความของตำแหน่งในไฟล์:
<WebControls
clientsCriptSlocation = "/_ aspx/{0}/สคริปต์/"
-
คุณได้รับการสนับสนุนให้อ่านสคริปต์เพื่อรับข้อมูลเชิงลึกเกี่ยวกับสิ่งที่เกิดขึ้น อย่างไรก็ตามขอแนะนำให้คุณไม่แก้ไขสคริปต์เหล่านี้เนื่องจากฟังก์ชั่นของพวกเขาเชื่อมโยงอย่างใกล้ชิดกับเวอร์ชันรันไทม์เฉพาะ เมื่ออัปเดตเวอร์ชันรันไทม์สคริปต์เหล่านี้อาจต้องมีการอัปเดตที่เกี่ยวข้องและคุณจะละทิ้งการเปลี่ยนแปลงหรือเผชิญกับปัญหาที่สคริปต์ไม่ทำงาน หากโครงการเฉพาะต้องเปลี่ยนสคริปต์เหล่านี้ให้สำรองสคริปต์ก่อนจากนั้นชี้โครงการของคุณไปยังไฟล์สำรองโดยแทนที่ตำแหน่งของไฟล์เหล่านี้ด้วยไฟล์ config.web ส่วนตัว หากสตริงมีคำสั่งรูปแบบ "{0}" หมายเลขเวอร์ชันรันไทม์จะแทนที่คำสั่ง เป็นการดีที่สุดที่จะเปลี่ยนตำแหน่งนั้นเป็นข้อมูลอ้างอิงที่สัมพันธ์กันหรือสัมบูรณ์
ปิดใช้งานการรับรองความถูกต้องของลูกค้า
บางครั้งคุณอาจไม่ต้องการการรับรองความถูกต้องของลูกค้า หากจำนวนฟิลด์อินพุตมีขนาดเล็กการตรวจสอบไคลเอนต์อาจใช้งานเพียงเล็กน้อย ท้ายที่สุดคุณต้องมีตรรกะที่ต้องเดินทางไปและกลับจากเซิร์ฟเวอร์ทุกครั้ง คุณจะพบว่าข้อมูลที่ปรากฏแบบไดนามิกบนไคลเอนต์จะมีผลกระทบเชิงลบต่อเค้าโครงของคุณ
ในการปิดใช้งานการรับรองความถูกต้องของไคลเอนต์ให้ใช้คำสั่งหน้า "clientTarget = downlevel" คำสั่งนี้คล้ายกับจุดเริ่มต้นของไฟล์ ASPX ต่อไปนี้:
< %@ page language = "C#" clientTarget = downlevel %>
ค่าเริ่มต้นของคำสั่งนี้คือ "อัตโนมัติ" ซึ่งหมายความว่าคุณจะทำการตรวจสอบสิทธิ์ไคลเอนต์สำหรับ Microsoft Internet Explorer 4.0 หรือใหม่กว่า
หมายเหตุ: น่าเสียดายที่ในเบต้า 1 คำสั่งนี้ไม่เพียงแค่ปิดใช้งานการตรวจสอบ แต่ยังทำให้การควบคุมเว็บทั้งหมดถูกประมวลผลโดยใช้แท็ก HTML 3.2 ซึ่งสามารถให้ผลลัพธ์ที่ไม่คาดคิด เวอร์ชันสุดท้ายเป็นวิธีที่ดีกว่าในการควบคุมปัญหานี้
ลำดับเหตุการณ์ลูกค้า
ลำดับนี้เป็นลำดับของเหตุการณ์ที่เกิดขึ้นเมื่อเรียกใช้หน้าเว็บที่มีการตรวจสอบไคลเอ็นต์:
เมื่อหน้าโหลดลงในเบราว์เซอร์แต่ละตัวควบคุมการตรวจสอบจะต้องเริ่มต้นบางครั้ง การควบคุมเหล่านี้จะถูกส่งเป็นแท็ก <span> และแอตทริบิวต์ HTML ของพวกเขาอยู่ใกล้กับที่อยู่บนเซิร์ฟเวอร์มากที่สุด สิ่งสำคัญที่สุดคือองค์ประกอบอินพุตทั้งหมดที่อ้างอิงโดยผู้ตรวจสอบคือ "ติดตั้ง" ในเวลานี้ องค์ประกอบอินพุตอ้างอิงจะแก้ไขเหตุการณ์ไคลเอนต์เพื่อให้รูทีนการตรวจสอบถูกเรียกว่าทุกครั้งที่อินพุตเปลี่ยนแปลง
รหัสในไลบรารีสคริปต์จะถูกดำเนินการเมื่อผู้ใช้สลับระหว่างฟิลด์โดยใช้คีย์แท็บ เมื่อมีการเปลี่ยนแปลงฟิลด์แยกต่างหากเงื่อนไขการตรวจสอบจะถูกประเมินอีกครั้งทำให้ตัวตรวจสอบความถูกต้องมองเห็นหรือมองไม่เห็นตามต้องการ
เมื่อผู้ใช้พยายามส่งแบบฟอร์มผู้ตรวจสอบทั้งหมดจะได้รับการประเมินอีกครั้ง หากผู้ตรวจสอบทั้งหมดเหล่านี้ถูกต้องแบบฟอร์มจะถูกส่งไปยังเซิร์ฟเวอร์ หากมีข้อผิดพลาดอย่างน้อยหนึ่งสถานการณ์สถานการณ์ต่อไปนี้จะเกิดขึ้น:
การส่งถูกยกเลิก แบบฟอร์มไม่ได้ส่งไปยังเซิร์ฟเวอร์
ตัวตรวจสอบที่ไม่ถูกต้องทั้งหมดสามารถมองเห็นได้
หากสรุปการตรวจสอบมีการแสดง showmary = true ข้อผิดพลาดทั้งหมดจากการควบคุมการตรวจสอบจะถูกรวบรวมและเนื้อหาของพวกเขาจะได้รับการปรับปรุงด้วยข้อผิดพลาดเหล่านั้น
หากสรุปการตรวจสอบมี showMessageBox = จริงจะมีการรวบรวมและแสดงข้อผิดพลาดในกล่องข้อมูลของลูกค้า
เนื่องจากการควบคุมการตรวจสอบของลูกค้าจะถูกดำเนินการในแต่ละครั้งที่มีการเปลี่ยนแปลงหรือส่งการควบคุมการตรวจสอบเหล่านี้มักจะถูกประเมินบนไคลเอนต์สองครั้งหรือมากกว่า โปรดทราบว่าหลังจากการส่งการควบคุมการตรวจสอบเหล่านี้จะยังคงได้รับการประเมินอีกครั้งบนเซิร์ฟเวอร์
API ลูกค้า
มี API ขนาดเล็กที่สามารถใช้กับเครื่องไคลเอนต์เพื่อให้ได้เอฟเฟกต์ต่าง ๆ ในรหัสไคลเอนต์ของคุณเอง เนื่องจากรูทีนบางอย่างไม่สามารถซ่อนได้ในทางทฤษฎีคุณสามารถใช้ประโยชน์จากไคลเอนต์เพื่อตรวจสอบตัวแปรคุณสมบัติและฟังก์ชั่นทั้งหมดที่กำหนดโดยสคริปต์ อย่างไรก็ตามสิ่งเหล่านี้ส่วนใหญ่เป็นรายละเอียดการใช้งานที่สามารถเปลี่ยนแปลงได้ ต่อไปนี้สรุปวัตถุลูกค้าที่เราสนับสนุนให้คุณใช้
ตารางที่ 3 วัตถุไคลเอนต์
ชื่อประเภทคำอธิบาย
ตัวแปรบูลีน page_isvalid ระบุว่าหน้าเว็บนั้นใช้ได้หรือไม่ สคริปต์การตรวจสอบจะช่วยให้ตัวแปรทันสมัยอยู่เสมอ
อาร์เรย์องค์ประกอบ page_validators นี่คืออาร์เรย์ที่มีตัวตรวจสอบทั้งหมดในหน้า
ตัวแปรบูลีน page_validationactive ระบุว่าควรทำการตรวจสอบหรือไม่ การตั้งค่าตัวแปรนี้เป็นเท็จสามารถปิดได้โดยการเขียนโปรแกรม
คุณสมบัติบูลีน isvalid แต่ละตัวตรวจสอบไคลเอนต์มีคุณสมบัตินี้ระบุว่าตัวตรวจสอบความถูกต้องในปัจจุบันหรือไม่ โปรดทราบว่าในเวอร์ชัน PDC คุณสมบัตินี้ผสมกับตัวพิมพ์ใหญ่บนและล่าง ("isvalid")
ข้ามการรับรองความถูกต้องของลูกค้า
งานหนึ่งที่คุณต้องดำเนินการบ่อยครั้งคือการเพิ่มปุ่มยกเลิกหรือปุ่มนำทางบนหน้า ในกรณีนี้คุณอาจต้องการส่งหน้าโดยใช้ปุ่มแม้ว่าจะมีข้อผิดพลาดในหน้า เนื่องจากปุ่ม "onclick" ของลูกค้าเกิดขึ้นก่อนเหตุการณ์ "onsubmit" ของแบบฟอร์มจึงอาจหลีกเลี่ยงการส่งการตรวจสอบและข้ามการตรวจสอบ ต่อไปนี้อธิบายวิธีการทำงานให้เสร็จสมบูรณ์โดยใช้การควบคุมภาพ HTML เป็นปุ่มยกเลิก:
<อินพุตประเภท = image runat = เซิร์ฟเวอร์
value = "ยกเลิก"
onserverClick = cmdcancel_click>
การดำเนินงานนี้โดยใช้ปุ่มหรือการควบคุม ImageButton จะทำให้เกิดความสับสนเนื่องจากเหตุการณ์ "onClick" ถือว่าเป็นเหตุการณ์ฝั่งเซิร์ฟเวอร์ที่มีชื่อเดียวกัน คุณควรตั้งค่าเหตุการณ์ในสคริปต์ไคลเอนต์:
<ASP: ImageButton Runat = Server ID = CMDimGCancel
AlternateText = "ยกเลิก"
onclick = cmdcancel_click/>
<ภาษาสคริปต์ = "JavaScript">
document.all ["cmdimgcancel"]. onclick =
ฟังก์ชั่นใหม่ ("page_validationactive = false;");
</script>
อีกวิธีหนึ่งในการแก้ปัญหานี้คือการตั้งค่าปุ่มยกเลิกเพื่อไม่ให้เกิดเหตุการณ์การกระทำในสคริปต์ไคลเอนต์เมื่อมันกลับมา การควบคุม HTMLINPUTBUTTON และ LINKBUTTON เป็นตัวอย่างของสิ่งนี้
เทคนิคพิเศษ
ข้อกำหนดทั่วไปอีกประการหนึ่งคือในกรณีที่มีข้อผิดพลาดนอกเหนือจากข้อความแสดงข้อผิดพลาดที่แสดงโดยตัวตรวจสอบตัวเองมีผลกระทบอื่น ๆ ในกรณีนี้การแก้ไขใด ๆ ที่คุณทำจะต้องทำพร้อมกันบนเซิร์ฟเวอร์หรือไคลเอนต์ สมมติว่าคุณต้องเพิ่มป้ายกำกับเพื่อเปลี่ยนสีขึ้นอยู่กับว่าอินพุตนั้นถูกต้องหรือไม่ นี่คือวิธีการใช้งานนี้บนเซิร์ฟเวอร์:
Public Class ChangecolorPage: หน้า {
ฉลากสาธารณะ lblzip;
Public RegularexpressionValidator Valzip;
ได้รับการป้องกันการแทนที่โมฆะ OnLoad (EventArgs E) {
lblzip.forecolor = valzip.isvalid?
-
-
วิธีการทั้งหมดข้างต้นนั้นสมบูรณ์แบบ แต่ตราบใดที่คุณแก้ไขการตรวจสอบตามที่กล่าวไว้ข้างต้นคุณจะพบว่าถ้าคุณไม่ทำเช่นเดียวกันกับลูกค้ามันจะดูไม่สอดคล้องกันมาก เฟรมเวิร์กการตรวจสอบจะป้องกันไม่ให้คุณจากเอฟเฟกต์คู่เหล่านี้จำนวนมาก แต่ไม่สามารถหลีกเลี่ยงเอฟเฟกต์อื่น ๆ ที่คุณต้องได้รับพร้อมกันทั้งในไคลเอนต์และเซิร์ฟเวอร์ นี่คือตัวอย่างของการทำงานเดียวกันกับลูกค้า:
<asp: label id = lblzip runat = เซิร์ฟเวอร์
text = "รหัสไปรษณีย์:"/>
<asp: textbox id = txtzip runat = เซิร์ฟเวอร์
/> </asp: กล่องข้อความ> <br>
<asp: regularexpressionValidator id = valzip runat = เซิร์ฟเวอร์
controltovalidate = txtzip
errorMessage = "รหัสไปรษณีย์ไม่ถูกต้อง"
ValidationExpression = "[0-9] {5}" /> <br>
<ภาษาสคริปต์ = JavaScript>
ฟังก์ชั่น txtziponchange () {
// หากการรับรองความถูกต้องของไคลเอ็นต์ไม่ทำงานจะไม่มีการดำเนินการใด ๆ
if (typeof (page_validators) == "undefined") return;
// เปลี่ยนสีของฉลาก
lblzip.style.color = valzip.isvalid?
-
</script>
เบต้า 1 ไคลเอนต์ API
สำหรับเบต้าเวอร์ชัน 1 ฟังก์ชั่นบางอย่างที่สามารถเรียกได้จากสคริปต์ไคลเอนต์อาจทำให้เกิดสถานการณ์อื่น
ตารางที่ 4. ฟังก์ชั่นที่เรียกจากสคริปต์ไคลเอ็นต์
คำอธิบายชื่อ
ValidatorValidate (VAL) ใช้ตัวตรวจสอบไคลเอนต์เป็นอินพุต ทำให้ผู้ตรวจสอบตรวจสอบอินพุตและอัปเดตการแสดงผล
Validatorenable (VAL, เปิดใช้งาน) ได้รับการตรวจสอบความถูกต้องของไคลเอนต์และค่าบูลีน เปิดใช้งานหรือปิดใช้งานตัวตรวจสอบไคลเอนต์ หากปิดการใช้งานตัวตรวจสอบไคลเอนต์จะไม่ได้รับการประเมินและตัวตรวจสอบไคลเอ็นต์จะปรากฏว่าถูกต้องเสมอ
ValidatorHookUpControl (ควบคุม, VAL) ได้รับองค์ประกอบอินพุต HTML และตัวตรวจสอบไคลเอ็นต์ แก้ไขหรือสร้างเหตุการณ์การเปลี่ยนแปลงสำหรับองค์ประกอบนั้นเพื่อให้ผู้ตรวจสอบได้รับการอัปเดตเมื่อมีการเปลี่ยนแปลง ฟังก์ชั่นนี้เหมาะสำหรับตัวตรวจสอบที่กำหนดเองตามค่าอินพุตหลายค่า
วัตถุประสงค์พิเศษของมันคือการเปิดใช้งานหรือปิดการใช้งานตัวตรวจสอบ หากคุณต้องการให้การตรวจสอบมีผลบังคับใช้เฉพาะในสถานการณ์เฉพาะคุณอาจต้องเปลี่ยนสถานะการเปิดใช้งานทั้งบนเซิร์ฟเวอร์และไคลเอนต์มิฉะนั้นคุณจะพบว่าผู้ใช้ไม่สามารถส่งหน้าเว็บได้
ต่อไปนี้เป็นตัวอย่างด้านบนบวกกับฟิลด์ที่ตรวจสอบแล้วเฉพาะเมื่อไม่ถูกตรวจสอบช่อง
คลาสสาธารณะเงื่อนไข: หน้า {
public htmlinputcheckbox chksameas;
สาธารณะที่ต้องการฟีลฟิลด์ Validator rfvalshipaddress;
ได้รับการป้องกันการแทนที่โมฆะตรวจสอบ () {
bool enableship =! chksameas.checked;
rfvalshipaddress.enabled = enableship;
base.validate ();
-
-
นี่คือรหัสเทียบเท่าลูกค้า:
<อินพุตประเภท = ช่องทำเครื่องหมาย runat = เซิร์ฟเวอร์ ID = chksameas
> เหมือนกับที่อยู่การชำระเงิน <br>
<ภาษาสคริปต์ = JavaScript>
ฟังก์ชั่น onchangesameas () {
var enableship =! event.srcelement.status;
ตรวจสอบความถูกต้อง (rfvalshipaddress, enableship);
-
</script>