所以我在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来在页面加载时最初禁用文本框的可写性,以使我的应用程序正常工作。
谢谢!
答案 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修复。