API ลูกค้า
มี API ขนาดเล็กที่สามารถใช้กับลูกค้าเพื่อให้ได้เอฟเฟกต์ต่าง ๆ ในรหัสลูกค้าของคุณเอง เนื่องจากรูทีนบางอย่างไม่สามารถซ่อนได้ในทางทฤษฎีคุณสามารถใช้ไคลเอนต์เพื่อตรวจสอบตัวแปรคุณสมบัติและฟังก์ชั่นที่กำหนดโดยไคลเอนต์ทั้งหมด อย่างไรก็ตามหลายคนสามารถเปลี่ยนแปลงได้ ต่อไปนี้สรุปวัตถุลูกค้าที่เราสนับสนุนให้คุณใช้
ตารางที่ 3 วัตถุไคลเอนต์
ชื่อประเภทคำอธิบาย
ตัวแปร Boolean PAGE_ISVALID ชี้ให้เห็นว่าหน้าเว็บนั้นถูกต้องหรือไม่ การตรวจสอบสคริปต์จะทำให้ตัวแปรล่าสุดอยู่เสมอ
อาร์เรย์องค์ประกอบ page_validator นี่คืออาร์เรย์ที่มีการตรวจสอบทั้งหมดในหน้า
page_validationactive ตัวแปรบูลีนระบุว่าควรตรวจสอบหรือไม่ ตั้งค่าตัวแปรนี้เป็นเท็จสามารถพิสูจน์ได้โดยการเขียนโปรแกรม
แอตทริบิวต์ isvalid boolen อุปกรณ์ตรวจสอบไคลเอนต์แต่ละตัวมีคุณสมบัติชี้ให้เห็นว่าอุปกรณ์ตรวจสอบนั้นถูกต้องหรือไม่ โปรดทราบว่าในเวอร์ชัน PDC แอตทริบิวต์นี้ผสมกับ Isvalid
ข้ามการตรวจสอบลูกค้า
งานหนึ่งที่คุณต้องดำเนินการบ่อยครั้งคือการเพิ่มปุ่ม "ยกเลิก" หรือปุ่มนำทางบนหน้า ในกรณีนี้แม้ว่าจะมีข้อผิดพลาดในหน้าคุณอาจต้องการใช้ปุ่มเพื่อส่งหน้า เนื่องจากปุ่ม client onclick เกิดขึ้นก่อนเหตุการณ์ onsubmit ของแบบฟอร์มจึงอาจหลีกเลี่ยงการส่งการตรวจสอบและข้ามการตรวจสอบ ต่อไปนี้แสดงวิธีใช้การควบคุมภาพ HTML เป็นปุ่ม "ยกเลิก" เพื่อให้งานเสร็จสมบูรณ์:
<อินพุตประเภท = image runat = เซิร์ฟเวอร์
ค่า = ยกเลิก
onclick = page_validationactive = false;
onserverClight = 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;
ค่า regulaxpressionValidator สาธารณะ;
ได้รับการป้องกันการแทนที่โมฆะ overoad (eventargs e) {{
lblzip.forecolor = valzip.isvalid?
-
-
วิธีการทั้งหมดข้างต้นนั้นสมบูรณ์แบบ แต่ตราบใดที่คุณแก้ไขการตรวจสอบด้านบนคุณจะพบว่าถ้าคุณไม่ได้ดำเนินการเดียวกันกับลูกค้ามันจะดูไม่สอดคล้องกันมาก เฟรมเวิร์กการตรวจสอบจะช่วยให้คุณหลีกเลี่ยงเอฟเฟกต์คู่ดังกล่าวได้ แต่ไม่สามารถหลีกเลี่ยงผลกระทบอื่น ๆ ที่คุณต้องได้รับในเวลาเดียวกันกับไคลเอนต์และเซิร์ฟเวอร์ ต่อไปนี้เป็นส่วนที่ทำงานเดียวกันกับลูกค้า:
<asp: label id = lblzip runat = เซิร์ฟเวอร์
text = zip code:/>
<asp: textbox id = txtzip runat = เซิร์ฟเวอร์
onchange = txtziponchange (); /> < /asp: textbox> <br>
<ASP: RegantyXpressionValididator id = valzip runat = เซิร์ฟเวอร์
controltovalidate = txtzip
errorMessage = รหัสไปรษณีย์ไม่ถูกต้อง
validationxpression = [0-9] {5} /> <br>
<ภาษาสคริปต์ = JavaScript>
ฟังก์ชั่น txtziponchange () {{) {
// หากการตรวจสอบลูกค้าไม่ได้อยู่ในกิจกรรมมันจะไม่ดำเนินการใด ๆ
ifof (page_validators) == undefined) return;
// เปลี่ยนสีของฉลาก
lblzip.style.color = valzip.isvalid?
-
</script>
เบต้า 1 ไคลเอนต์ API
สำหรับรุ่นเบต้า 1 ฟังก์ชั่นบางอย่างที่สามารถเรียกได้จากสคริปต์ไคลเอนต์จะทำให้เกิดสถานการณ์อื่น
ตารางที่ 4 ฟังก์ชั่นจากการโทรสคริปต์ไคลเอนต์
คำอธิบายชื่อ
ValidatorValidate (VAL) ใช้อุปกรณ์ตรวจสอบไคลเอนต์เป็นอินพุต ทำให้อุปกรณ์ตรวจสอบตรวจสอบอินพุตและอัปเดตการแสดงผล
Validatorenable (VAL, เปิดใช้งาน) ได้รับอุปกรณ์ตรวจสอบไคลเอนต์และค่าบูลีน เปิดหรือปิดใช้งานอุปกรณ์ยืนยันไคลเอนต์ หากถูกปิดใช้งานอุปกรณ์ตรวจสอบไคลเอนต์จะไม่ได้รับการประเมินและตัวตรวจสอบไคลเอนต์จะถูกต้องเสมอ
ValidatorHookUpControl (การควบคุม, VAL) ได้รับองค์ประกอบอินพุต HTML และอุปกรณ์ตรวจสอบไคลเอนต์ แก้ไขหรือสร้างเหตุการณ์การเปลี่ยนแปลงขององค์ประกอบเพื่อให้สามารถอัปเดตอุปกรณ์ตรวจสอบได้ในระหว่างการเปลี่ยนแปลง ฟังก์ชั่นนี้เหมาะสำหรับการตรวจสอบที่กำหนดเองตามค่าอินพุตหลายค่า
วัตถุประสงค์พิเศษคือการเปิดใช้งานหรือปิดใช้งานอุปกรณ์ตรวจสอบ หากคุณต้องการตรวจสอบว่าคุณมีผลเฉพาะในสถานการณ์เฉพาะคุณอาจต้องเปลี่ยนสถานะการเปิดใช้งานในเวลาเดียวกันบนเซิร์ฟเวอร์และไคลเอนต์มิฉะนั้นคุณจะพบว่าผู้ใช้ไม่สามารถส่งหน้าเว็บได้
ต่อไปนี้เป็นตัวอย่างข้างต้นพร้อมฟิลด์
คลาสสาธารณะเงื่อนไข: หน้า {
public htmlinputcheckbox chksameas;
Public ResearchfieldValidator Rfvalshipaddress;
Void Void ที่ได้รับการป้องกันการตรวจสอบ () {) {)
bool enableship =!
rfvalshipaddress.enabled = enableship;
base.validate ();
-
-
ต่อไปนี้เป็นรหัสของลูกค้าเทียบเท่า:
<อินพุตประเภท = ช่องทำเครื่องหมาย runat = เซิร์ฟเวอร์ ID = chksameas
onclick = onChangesameas ();> เช่นเดียวกับที่อยู่การชำระเงิน <br>
<ภาษาสคริปต์ = JavaScript>
ฟังก์ชั่น onchangesameas () {
var entleship =!
ตรวจสอบความถูกต้อง (rfvalshipaddress, enableship);
-
</script>
กฎที่มีประสิทธิภาพและข้อมูลข้อผิดพลาดที่เป็นประโยชน์
อุปกรณ์ตรวจสอบแต่ละตัวแสดงข้อมูลข้อผิดพลาดเฉพาะเกี่ยวกับเงื่อนไขเฉพาะในการควบคุมเฉพาะ มีกฎบางอย่างที่ยืนยันว่ามันถูกต้องหรือไม่
การตรวจสอบที่ว่างเปล่าทั้งหมด (ยกเว้นสำหรับ FieldValidator ที่ต้องการ) ถือว่าถูกต้อง หากค่าที่ว่างเปล่าไม่ถูกต้องคุณมักจะต้องใช้ฟีลด์ฟิลด์ที่จำเป็นและผู้ตรวจสอบอื่น ๆ คุณต้องทำเช่นนี้เพราะโดยทั่วไปคุณต้องการแสดงข้อมูลข้อผิดพลาดที่แตกต่างกันเกี่ยวกับอุปกรณ์ตรวจสอบที่ว่างเปล่าและประสิทธิภาพ นอกจากนี้คุณยังสามารถใช้ข้อมูลที่ไม่ชัดเจนเช่น "คุณต้องป้อนค่าและค่านี้จะต้องอยู่ระหว่าง 1 ถึง 10"
กฎพิเศษอื่นที่ใช้เมื่อไม่สามารถแปลงฟิลด์อินพุตเป็นชนิดข้อมูลที่ระบุนั้นเกี่ยวข้องกับการเปรียบเทียบและ rangevalidator กระบวนการประเมินความถูกต้องของผู้เปรียบเทียบการควบคุมของ ControlTocompare ระบุกระบวนการประเมินความถูกต้องตามที่อธิบายไว้ด้านล่าง:
หากฟิลด์อินพุตที่อ้างอิงโดย ControlTovalidate นั้นว่างเปล่าก็จะมีประสิทธิภาพ
หากฟิลด์อินพุตที่อ้างอิงโดย ControlTovalidate ไม่สามารถแปลงเป็นชนิดข้อมูลที่ต้องการได้จะไม่ถูกต้อง
หากฟิลด์อินพุตที่อ้างอิงโดย ControlTocompare ไม่สามารถแปลงเป็นชนิดข้อมูลที่ต้องการได้จะถูกต้อง
ฟิลด์อินพุตจะถูกแปลงเป็นชนิดข้อมูลที่ต้องการและเปรียบเทียบ
ขั้นตอนที่สามดูไม่สอดคล้องกันเล็กน้อย เหตุผลนี้เป็นเพราะหากอุปกรณ์ตรวจสอบตรวจสอบประสิทธิภาพของหลายฟิลด์ในเวลาเดียวกันมันเป็นเรื่องยากที่จะเขียนข้อมูลข้อผิดพลาดที่มีความหมายสำหรับอุปกรณ์ตรวจสอบ ควรใช้อุปกรณ์ตรวจสอบอิสระเพื่อรายงานสถานการณ์ข้อผิดพลาดในฟิลด์อินพุต ControlTocompare Rangevalidator มีวิธีการทำงานที่คล้ายกันโดยมีคุณสมบัติสูงสุดและต่ำสุด
ฟังก์ชั่นคุณสมบัติที่เปิดใช้งานมองเห็นและแสดงผล
ความแตกต่างระหว่างคุณสมบัติที่เปิดใช้งานการมองเห็นและการแสดงผลของอุปกรณ์ตรวจสอบอาจไม่ชัดเจนมาก
display = none สามารถใช้เพื่อระบุว่าอุปกรณ์ตรวจสอบไม่แสดงเนื้อหาใด ๆ โดยตรง แต่ยังคงประเมินยังคงมีผลต่อประสิทธิภาพโดยรวมและยังสามารถใส่ข้อผิดพลาดในบทสรุปของไคลเอนต์และเซิร์ฟเวอร์ สำหรับการตรวจสอบลูกค้าค่าเหล่านี้จะถูกกำหนดให้ใช้คุณสมบัติสไตล์ที่มองเห็นได้หรือใช้คุณสมบัติสไตล์การแสดงผลเพื่อเปิดหรือปิดอุปกรณ์การตรวจสอบ สำหรับเซิร์ฟเวอร์ -การตรวจสอบด้านข้าง, display = dynamic หมายความว่าอินพุตไม่แสดงเนื้อหาใด ๆ เมื่ออินพุตถูกต้องและ display = static แสดงถึงพื้นที่ที่ไม่เปลี่ยนแปลง () การตั้งค่าสุดท้ายจะถูกพับลงในเนื้อหาเมื่อเซลล์ที่มีเฉพาะอุปกรณ์ตรวจสอบในตารางนั้นถูกต้อง
ทำไมไม่ใช้ Visible = False เพื่อให้อุปกรณ์ตรวจสอบมองเห็นได้? ใน ASP+แอตทริบิวต์ที่มองเห็นได้ของการควบคุมมีความหมายมากมาย: การควบคุมของ Visible = False จะไม่ถูกประมวลผลหรือแสดงเลย มันเป็นเพราะความหมายนี้ว่าสิ่งที่มองเห็นได้ = เท็จของอุปกรณ์ตรวจสอบหมายความว่าไม่เพียง แต่ไม่แสดงเนื้อหาใด ๆ แต่ยังไม่สามารถใช้งานได้ อุปกรณ์ตรวจสอบนี้จะไม่ได้รับการประเมินจะไม่ส่งผลกระทบต่อความถูกต้องของหน้าและจะไม่ถูกใส่ในนามธรรม
เปิดใช้งานเป็นกลาง ในกรณีส่วนใหญ่ผลของ enabled = false และ visible = false นั้นเหมือนกันทุกประการ ในรุ่นเบต้า 1 หรือรุ่นที่สูงกว่ามีความแตกต่างที่สำคัญ: ในการตรวจสอบไคลเอ็นต์อุปกรณ์ตรวจสอบการปิดใช้งานจะยังคงถูกส่งไปยังเบราว์เซอร์ แต่อยู่ในสถานะปิดใช้งาน คุณสามารถใช้ฟังก์ชั่นที่ถูกต้องได้ในสคริปต์ไคลเอนต์เพื่อเปิดใช้งานอุปกรณ์ตรวจสอบ
เมื่อใช้การมองเห็นหรือเปิดใช้งานเพื่อควบคุมว่าจะตรวจสอบให้ใส่ใจกับคำสั่งซื้อตามคำสั่งซื้อบนเซิร์ฟเวอร์ข้างต้น หรือเปลี่ยนแปลงก่อนการตรวจสอบหรือตรวจสอบอีกครั้งหลังจากการเปลี่ยนแปลง มิฉะนั้นค่า isvalid ของพวกเขาจะไม่สะท้อนการเปลี่ยนแปลงของแอตทริบิวต์
การควบคุม customvalidator
วิธีที่ง่ายที่สุดในการขยายกรอบการตรวจสอบคือการใช้ตัวควบคุม CustomValidator การควบคุมนี้สามารถใช้ในการตรวจสอบว่าการควบคุมการตรวจสอบอื่น ๆ ไม่สามารถทำได้ แต่พวกเขายังสามารถดำเนินการตรวจสอบที่จำเป็นต้องเข้าถึงข้อมูลบนเซิร์ฟเวอร์ (เช่นฐานข้อมูลหรือบริการเว็บ)
หากมีการเพิ่มฟังก์ชั่นการตรวจสอบเซิร์ฟเวอร์เดียวเท่านั้นคุณจะสังเกตเห็นว่าอุปกรณ์ตรวจสอบไม่ได้เข้าร่วมในการตรวจสอบไคลเอนต์ เมื่อผู้ใช้สลับระหว่างแต่ละฟิลด์ด้วยคีย์แท็บ CustomValidator จะไม่ได้รับการอัปเดตและเซิร์ฟเวอร์ Round -Trip จะต้องทำการตรวจสอบในครั้งเดียว หากคุณต้องการใช้ CustomValidator เพื่อทำการตรวจสอบที่ไม่ต้องการข้อมูลใด ๆ บนเซิร์ฟเวอร์คุณสามารถใช้คุณสมบัติ ClientValidationFunction เพื่อให้อุปกรณ์ตรวจสอบมีส่วนร่วมในการตรวจสอบไคลเอนต์ได้อย่างสมบูรณ์ สมมติว่าคุณให้ clientvalidationfunction แต่ในความเป็นจริงมันเป็นเพียงส่วนหนึ่งของการตรวจสอบ การตรวจสอบฟังก์ชั่นการตรวจสอบไคลเอนต์ไม่เกินการตรวจสอบการดำเนินการบนเซิร์ฟเวอร์เนื่องจากแฮกเกอร์สามารถข้ามฟังก์ชั่นการตรวจสอบได้อย่างง่ายดาย
ต่อไปนี้เป็นตัวอย่างง่ายๆของการใช้ CustomValidator บนไคลเอนต์และเซิร์ฟเวอร์ตรวจสอบว่าอินพุตนั้นมีอยู่หรือไม่ มาแนะนำฟังก์ชั่นเซิร์ฟเวอร์ (ใน C#):
{บริการบางส่วน) {ตำแหน่ง
พยายาม {
int i = int.fromstring (ค่า);
return ((i % 2) == 0);
} จับ {
กลับเท็จ;
-
-
ต่อไปนี้เป็นวิธีการประกาศของฟังก์ชั่นบนไคลเอนต์และฟังก์ชั่นการตรวจสอบไคลเอนต์ที่ดำเนินการตรวจสอบเดียวกัน นี่เป็นรูปแบบ JScript แต่ถ้าเป้าหมายของคุณคือMicrosoft® Internet Explorer คุณยังสามารถใช้แบบฟอร์มVBScript®
<ASP: CustomValidator ID = CustomVal2 runat = เซิร์ฟเวอร์
errorMessage = ตัวเลขไม่สามารถลบได้!
controltovalidate = txtCustomData
onservalidationFunction = servervalidation
clientValidationFunction = checkeven /> <br>
ฟิลด์ข้อมูล: <asp: textbox id = txtcustosdata runat = เซิร์ฟเวอร์ />
<ภาษาสคริปต์ = JavaScript>
-
ฟังก์ชั่น checkeven (แหล่งที่มา, ค่า) {{
var value = parseInt (ค่า, 10);
ถ้า (isnan (val))
กลับเท็จ;
return ((val % 2) == 0);
-
-
</script>
นี่คือข้อควรระวังบางประการโดยใช้ CustomValidator:
เช่นเดียวกับการควบคุมการตรวจสอบอื่น ๆ ทั้งหมด (ยกเว้นสำหรับ FieldValidator ที่ต้องการ) หากฟิลด์อินพุตว่างเปล่าก็จะพิจารณาว่า customValidator มีประสิทธิภาพ
หากใช้เบราว์เซอร์รุ่นเก่าหรือปิดการตรวจสอบไคลเอนต์จะไม่สามารถเรียกใช้ฟังก์ชันการตรวจสอบไคลเอนต์ ก่อนที่จะกำหนดฟังก์ชั่นคุณไม่จำเป็นต้องตรวจสอบฟังก์ชั่นของเบราว์เซอร์ที่ใช้ในเบราว์เซอร์ แต่คุณต้องตรวจสอบให้แน่ใจว่าเบราว์เซอร์ไม่ได้ทำให้เกิดข้อผิดพลาดของสคริปต์เนื่องจากคำจำกัดความ อย่าลืมทำให้รหัสลูกค้าของคุณเป็นคำอธิบายประกอบของ HTML ดังที่แสดงในตัวอย่างต่อไปนี้
พารามิเตอร์สองพารามิเตอร์จะถูกส่งผ่านไปยังฟังก์ชันไคลเอนต์ของคุณและสอดคล้องกับพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชันเซิร์ฟเวอร์ อย่างแรกคือองค์ประกอบอุปกรณ์ตรวจสอบไคลเอนต์และอย่างที่สองคือค่าควบคุมที่ระบุโดย ControlTovalidate อย่างไรก็ตามบนไคลเอนต์คุณสามารถเลือกที่จะไม่กำหนดพารามิเตอร์สำหรับฟังก์ชั่นซึ่งจะทำงานได้ตามปกติ
หากคุณใช้ Beta1 หรือรุ่นที่สูงกว่าคุณสามารถควบคุม Controltovalidate ได้ว่างเปล่า ในโหมดนี้ฟังก์ชั่นเซิร์ฟเวอร์จะทริกเกอร์การเดินทางไปกลับรอบเสมอและฟังก์ชั่นไคลเอนต์จะถูกทริกเกอร์ทุกครั้งที่คุณพยายามส่ง คุณสามารถใช้คุณสมบัตินี้เพื่อตรวจสอบการควบคุมที่วิธีการอื่นไม่สามารถตรวจสอบได้เช่นช่องทำเครื่องหมายหรือปุ่มวิทยุแยกต่างหาก หากเงื่อนไขขึ้นอยู่กับการควบคุมหลายตัวและคุณไม่ต้องการให้ผู้ใช้ประเมินเงื่อนไขเมื่อสลับระหว่างแต่ละฟิลด์บนหน้าคุณสามารถใช้วิธีนี้ได้
ตัวเลือกอื่นในรุ่นเบต้า 1 หรือสูงกว่าคือเหตุการณ์การเปลี่ยนแปลงของการควบคุมหลายตัว วิธีการคือการเพิ่มสคริปต์ฝังตัวที่เรียกฟังก์ชันไคลเอนต์ ValidatorHookupControl ตามที่อธิบายไว้ข้างต้น
การควบคุมใดที่สามารถตรวจสอบได้?
ในการเปิดใช้งานการควบคุมที่จะตรวจสอบโดยการอ้างอิงการควบคุมการควบคุมจะต้องมีคุณสมบัติที่ตรวจสอบแล้ว การควบคุมที่ได้รับการตรวจสอบทั้งหมดมีคุณสมบัติการตรวจสอบความถูกต้องของระบบการตรวจสอบซึ่งระบุว่าควรอ่านแอตทริบิวต์ที่ควรอ่านในระหว่างการตรวจสอบ หากคุณเขียนการควบคุมของคุณเองคุณสามารถระบุคุณสมบัติที่จะใช้โดยการจัดหาหนึ่งในนั้นเพื่อให้การควบคุมมีส่วนร่วมในการตรวจสอบ
ในการเปิดใช้งานการตรวจสอบที่จะดำเนินการตามปกติบนไคลเอนต์แอตทริบิวต์จะต้องสอดคล้องกับลักษณะค่าขององค์ประกอบ HTML ที่แสดงโดยไคลเอนต์ การควบคุมที่ซับซ้อนจำนวนมาก (เช่น DataGrid และปฏิทิน) ไม่คุ้มค่ากับไคลเอนต์และสามารถตรวจสอบได้บนเซิร์ฟเวอร์เท่านั้น ดังนั้นเฉพาะการควบคุมที่ใกล้เคียงกับองค์ประกอบ HTML เท่านั้นที่สามารถมีส่วนร่วมในการตรวจสอบ นอกจากนี้การควบคุมจะต้องมีค่าตรรกะเดียวบนไคลเอนต์ ดังนั้น RadiobuttonList สามารถตรวจสอบได้ แต่ CheckBoxList ไม่สามารถทำได้
จบ
คำอธิบายข้างต้นของการตรวจสอบ ASP+ อาจเกินเนื้อหาที่คุณต้องการเข้าใจ สนุกกับมัน!