在以前的ASP.NET 1.x版本中,设置为ReadOnly的TextBox控件在客户端更改了值后,在服务器端仍然可以得到修改后的值,但在ASP.NET 2.0中,这种做法已经限制。这是为了提高应用程序安全性所考虑的。下面就是TextBox控件获得数据的内部方法,由此可以看出ReadOnly的限 制:
protected
virtual
bool
LoadPostData(
string
postDataKey, NameValueCollection postCollection) {
base
.ValidateEvent(postDataKey);
string
text1
=
this
.Text;
string
text2
=
postCollection[postDataKey];
if
(
!
this
.ReadOnly
&&
!
text1.Equals(text2, StringComparison.Ordinal)) {
this
.Text
=
text2;
return
true
; }
return
false
; }
这里限制的只是Text属性,而没有限制提交数据的名称/值的NameValueCollection,因此,通过Request["表单名称"] 的方法仍然可以得到值的。下面的例子充分说明了这一点,并且提供了既使用ReadOnly,又可以通过Text属性获得值的方法:
<%
@ 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"
>
protected
void
Button1_Click(object sender, 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]); } protected
void
Page_Load(object sender, EventArgs e) { TextBox3.Attributes.Add(
"
readonly
"
,
"
readonly
"
); }
</
script
>
<
script
type
="text/javascript"
>
//
<![CDATA[
function
SetNewValue() { document.getElementById(
'
<%=TextBox1.ClientID %>
'
).value
=
"
TextBox1 new Value
"
; document.getElementById(
'
<%=TextBox2.ClientID %>
'
).value
=
"
TextBox2 new Value
"
; document.getElementById(
'
<%=TextBox3.ClientID %>
'
).value
=
"
TextBox3 new Value
"
; }
//
]]>
</
script
>
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
<
head
runat
="server"
>
<
title
>
ASP.NET 2.0中TextBox控件与ReadOnly和Enabled属性
</
title
>
</
head
>
<
body
>
<
form
id
="form1"
runat
="server"
>
<
span
>
TextBox1 ReadOnly:
</
span
>
<
asp:TextBox
ID
="TextBox1"
runat
="server"
ReadOnly
="True"
Text
="TextBox1 Old Value"
></
asp:TextBox
><
br
/>
<
span
>
TextBox2 Enabled:
</
span
>
<
asp:TextBox
ID
="TextBox2"
runat
="server"
Enabled
="False"
Text
="TextBox2 Old Value"
></
asp:TextBox
><
br
/>
<
span
>
TextBox3 ReadOnly:
</
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
="提交"
OnClick
="Button1_Click"
/>
</
form
>
</
body
>
</
html
>
对于disabled的TextBox,在服务器端不能得到修改的值,如果实在要用这个属性,那之后使用隐藏表单域的方法来实现了。
ReadOnly属性的TextBox在客户端会展现成这样的标记:
<input readonly = "readonly">
Enabled属性的TextBox在客户端会展现成这样的标记:
<input disabled="disabled">
按照W3C的规范:http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.12
设置为disabled的input将会有下面的限制:
- 不能接收焦点
- 使用tab键时将被跳过
- 可能不是successful的
设置为readonly的input将会有下面的限制:
- 可以接收焦点但不能被修改
- 可以使用tab键进行导航
- 可能是successful的
只有successful的表单元素才是有效数据,也即是可以进行提交。disabled和readonly的文本输入框只能通过脚本进行修改value属性。