一些背景知识
所以,我完成了在Web应用程序,做一些数据的自动插入一些改进。 有文本框的少数用户填写,并在它们之间具有自动计算值的其他文本框。 接收自动计算值的文本框必须readOnly的防止用户的变化,但不能禁用或他们不会得到回发上提交。 每个文本框的也有旁边的复选框,这样用户就可以有意识地检查一下以现场可写,从而使他们能够覆盖插入值。
浏览器:IE 7(不知道这是如何的行为在别人)
问题
当设置readOnly
支持JavaScript的文本框的属性,在文本框中的值将被提交与形式:我可以看到它与服务器端(ASP.NET) myTextBox.Text
和它在Request.Form("myTextBox")
。
如果我设置ReadOnly="true"
我上<asp:TextBox />
元素,并且不使用JavaScript方法,在文本框中的值不能从myTextBox.Text
(我假设它从未进入的ViewState
) ,但它越来越与提交形式: Request.Form("myTextBox")
有一个值。
我的问题(S)
到底他妈发生了什么? 这是设计? 这是一个浏览器的问题? 难道我发现了错误? 这很烦人,我必须有一些额外的JavaScript最初禁用文本框的可写时,为了在页面加载,使我的应用程序的工作。
谢谢!
这是由设计。 作为一个ASP.NET安全功能,将其设置为只读在服务器上会保持它的只读,无论在客户端上会发生什么。 如果你希望他们能够超越它,实际上提交值,那么它是不是真的只读在服务器上,只能有条件地在客户端上。 你可以做一个回发时,他们选中复选框,更改服务器上的只读属性,或者只设置使用该ASP.NET代码在客户端上的只读属性:
MyControl.Attributes.Add("readOnly","readOnly")
好吧,我调整我的样本,我想我看到的问题 - 我可能是错的,但我认为这是按预期行为。
当您设置一个字段设置为只读的代码隐藏的ASP:TextBox
似乎甚至JS成为不可改变的。 我做了一个变化,变化体现在JS和形式,但文本框保留了原有的文本值 - 除非我的请求看。 形成像你一样。
我不认为这是一个错误。 我认为这是故意的,让一些完全锁定 - 只读在服务器端挂在它看起来像一个首选。
我建议使用隐藏的输入字段和跨度或东西ASP:Labels
(这有效地呈现为跨度)给的显示方式由用户是不可调的?
或者,如果你有机会到JS库(如jQuery),你可以设置一个CSS类在你的文本框(带CssClass="readonly"
或类似的东西在你的标签),然后用选择过程来调整属性,像这样(假设jQuery的,很容易用其它语言编写):
$("input.readonly").attr("readonly","readonly");
这样一来,你不重写多少你的标记,这是一个quick'n'easy JS修复。
文章来源: Strange behavior using HTML 'readonly=“readonly”' vs. JavaScript 'element.readOnly = true;'