ในเวอร์ชัน ASP.NET 1.x ก่อนหน้านี้ ตัวควบคุมกล่องข้อความที่ตั้งค่าเป็น ReadOnly ยังคงได้รับค่าที่ปรับเปลี่ยนบนฝั่งเซิร์ฟเวอร์หลังจากที่ค่าถูกเปลี่ยนแปลงบนฝั่งไคลเอ็นต์ อย่างไรก็ตาม ใน ASP.NET 2.0 แนวทางปฏิบัตินี้ได้ถูกจำกัด . นี่ถือเป็นการปรับปรุงความปลอดภัยของแอปพลิเคชัน ต่อไปนี้เป็นวิธีการภายในของตัวควบคุมกล่องข้อความเพื่อรับข้อมูล ซึ่งเราสามารถดูข้อจำกัดของ ReadOnly ได้:
บูลเสมือนที่ได้รับการป้องกัน LoadPostData(string postDataKey, NameValueCollection postCollection)
-
ฐาน ValidateEvent (postDataKey);
สตริง text1 = this.Text;
สตริง text2 = postCollection [postDataKey];
ถ้า (!this.ReadOnly && !text1.Equals(text2, StringComparison.Ordinal))
-
นี่ข้อความ = text2;
กลับเป็นจริง;
-
กลับเท็จ;
}
สิ่งที่ถูกจำกัดในที่นี้เป็นเพียงแอตทริบิวต์ Text และไม่มีข้อจำกัดเกี่ยวกับ NameValueCollection ของชื่อ/ค่าของข้อมูลที่ส่ง ดังนั้น คุณยังคงได้รับค่าผ่านเมธอด Request["Form Name"] ตัวอย่างต่อไปนี้แสดงให้เห็นประเด็นนี้โดยครบถ้วน และให้วิธีการใช้แบบอ่านอย่างเดียวและรับค่าผ่านคุณสมบัติข้อความ:
<%@ Page Language="C#" EnableViewState="false" %>
<!DOCTYPE html PUBLIC "-/ /W3C/ /DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<script runat="server">
โมฆะที่ได้รับการป้องกัน Button1_Click (ผู้ส่งวัตถุ EventArgs e )
-
Response.Write("<li>TextBox1 = " + TextBox1.Text);
Response.Write("<li>TextBox2 = " + TextBox2.Text);
Response.Write("<li>TextBox3 = " + TextBox3.Text);
Response.Write("<li>Request.Form[TextBox1] = " + Request.Form[TextBox1.UniqueID]);
Response.Write("<li>Request.Form[TextBox2] = " + Request.Form[TextBox2.UniqueID]);
Response.Write("<li>Request.Form[TextBox3] = " + Request.Form[TextBox3.UniqueID]);
}
โมฆะที่ได้รับการป้องกัน Page_Load (ผู้ส่งวัตถุ EventArgs e)
-
TextBox3.Attributes.Add("อ่านอย่างเดียว", "อ่านอย่างเดียว");
-
</script>
<script type="text/javascript">
//<![ซีดีต้า[
ฟังก์ชั่น SetNewValue()
-
document.getElementById('<%=TextBox1.ClientID %>').value = "TextBox1 ค่าใหม่";
document.getElementById('<%=TextBox2.ClientID %>').value = "TextBox2 ค่าใหม่";
document.getElementById('<%=TextBox3.ClientID %>').value = "TextBox3 ค่าใหม่";
-
//]]
</script>
<html xmlns=" http://www.w3.org/1999/xhtml "">
<หัว runat="เซิร์ฟเวอร์">
<title>การควบคุมกล่องข้อความและคุณสมบัติอ่านอย่างเดียวและเปิดใช้งานใน ASP.NET 2.0</title>
</หัว><
<ร่างกาย>
<form id="form1" runat="server">
<span>กล่องข้อความ1 อ่านอย่างเดียว:</span>
<asp:TextBox ID="TextBox1" runat="server" ReadOnly="True" Text="TextBox1 Old Value"></asp:TextBox><br />
<span>เปิดใช้งานกล่องข้อความ2:</span>
<asp:TextBox ID="TextBox2" runat="server" Enabled="False" Text="TextBox2 Old Value"></asp:TextBox><br />
<span>กล่องข้อความ3 อ่านอย่างเดียว:</span>
<asp:TextBox ID="TextBox3" runat="server" Text="TextBox3 Old Value"></asp:TextBox><br />
<br />
<asp:Button ID="Button2" runat="server" Text="แก้ไขค่าใหม่" OnClientClick="SetNewValue();return false; />
<asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Click" />
</แบบฟอร์ม>
</ตัว>
</html>
สำหรับกล่องข้อความที่ปิดใช้งาน ไม่สามารถรับค่าที่แก้ไขบนฝั่งเซิร์ฟเวอร์ได้ หากคุณต้องการใช้แอตทริบิวต์นี้จริงๆ ให้ใช้วิธีการซ่อนฟิลด์แบบฟอร์มเพื่อให้บรรลุผล
กล่องข้อความที่มีคุณลักษณะ ReadOnly จะแสดงเป็นเครื่องหมายบนฝั่งไคลเอ็นต์:
<input readonly = "readonly">
กล่องข้อความที่มีคุณลักษณะ Enabled จะแสดงเป็นเครื่องหมายดังกล่าวบนฝั่งไคลเอ็นต์: <input Disabled="disabled ">
ตามข้อกำหนดของ W3C: http:// /www.w3.org/TR/REC-html40/interact/forms.html#h-17.12
อินพุตที่ตั้งค่าเป็นปิดใช้งานจะมีข้อจำกัดดังต่อไปนี้:
· ไม่สามารถรับโฟกัสได้ · จะถูกข้าม เมื่อใช้ปุ่มแท็บ · อาจไม่สำเร็จ
อินพุตที่ตั้งค่าเป็นแบบอ่านอย่างเดียวจะมีข้อจำกัดดังต่อไปนี้:
· สามารถรับโฟกัสได้แต่ไม่สามารถแก้ไขได้ · สามารถใช้ปุ่มแท็บเพื่อนำทาง · อาจสำเร็จได้
เฉพาะองค์ประกอบของฟอร์มที่สำเร็จเท่านั้นที่เป็นข้อมูลที่ถูกต้อง กล่าวคือ พวกเขาสามารถส่งได้ แอตทริบิวต์ค่าของกล่องป้อนข้อความที่ปิดใช้งานและแบบอ่านอย่างเดียวสามารถแก้ไขได้ผ่านสคริปต์เท่านั้น