使用HTML'readonly =“readonly”'与JavaScript'元素的奇怪行为.readOnly = true;'

时间:2009-06-29 20:58:37

标签: asp.net javascript internet-explorer cross-browser readonly

一些背景

所以我在Web应用程序中完成了一些增强功能,可以自动插入数据。用户填写了一些文本框,其中的其他文本框具有自动计算的值。接收自动计算值的文本框必须是readOnly以防止用户更改,但不能禁用或不会在回发时提交。每个文本框旁边都有一个复选框,因此用户可以有意识地检查它以使字段可写,从而允许它们覆盖插值。

浏览器:IE 7(不确定其他人的表现如何)

问题

使用JavaScript设置文本框的readOnly属性时,文本框中的值将使用以下格式提交:我可以在服务器端(ASP.NET)上看到它myTextBox.Text并且它是在Request.Form("myTextBox")

如果我在ReadOnly="true"元素上设置<asp:TextBox />并且未使用JavaScript方法,则myTextBox.Text中的文本框中的值为 NOT (我假设它从未进入ViewState),但它是以表格提交的:Request.Form("myTextBox")有一个值。

我的问题

到底发生了什么事?这是设计的吗?这是一个浏览器问题吗?我找到了一个bug吗?令人讨厌的是,我必须有一些额外的JavaScript来在页面加载时最初禁用文本框的可写性,以使我的应用程序正常工作。

谢谢!

2 个答案:

答案 0 :(得分:3)

这是设计的。作为ASP.NET安全功能,无论客户端发生什么,在服务器上将其设置为只读即可使其保持只读状态。如果您希望它们能够覆盖它并实际提交一个值,那么它在服务器上并不是真正的只读,只是在客户端上有条件地。您可以在选中复选框以更改服务器上的readonly属性时进行回发,也可以使用此ASP.NET代码仅在客户端上设置readonly属性:

MyControl.Attributes.Add("readOnly","readOnly")

答案 1 :(得分:0)

好吧,我调整了我的样本,我想我看到了问题 - 我可能错了,但我认为它的行为符合预期。

当你在代码隐藏上设置一个字段为ReadOnly时,即使是JS,ASP:TextBox似乎也变成了不可变的。我进行了更改,更改反映在JS和表单中,但TextBox保留了原始文本值 - 除非我查看请求。就像你一样。

我不认为这是一个错误。我认为这是有意的,保持一些完全锁定的东西 - 在服务器端只读一个看起来似乎是一个首选。

我可以建议使用隐藏的输入字段和跨度或ASP:Labels(有效地呈现为跨度)来提供用户无法调整的显示方面吗?

或者,如果您可以访问JS库(例如jQuery),则可以在TextBoxes上设置一个CSS类(在标签中使用CssClass="readonly"或类似的东西),然后使用选择过程调整属性,就像这样(假设jQuery,很容易用其他语言编写):

$("input.readonly").attr("readonly","readonly");

这样,你就不会重写你的大部分标记,而且这是一个快速且不容易的JS修复。