在以前的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["表单名称"]的方法仍然可以得到值的。
对于disabled的TextBox,在服务器端不能得到修改的值,如果实在要用这个属性,那之后使用隐藏表单域的方法来实现了。
ReadOnly属性的TextBox在客户端会展现成这样的标记:
<input readonly = "readonly">
Enabled属性的TextBox在客户端会展现成这样的标记: <input >
按照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属性。
若想保留asp.net1.1中的ReadyOnly功能,只需在服务器端加入contentEditable属性并设为false;
textBox.Attributes["contentEditable"] = "false";