2

一些背景

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

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

问题

使用 JavaScript设置文本框的readOnly属性时,文本框中的值与表单一起提交:我可以在服务器端 (ASP.NET) 上看到它,myTextBox.Text它位于Request.Form("myTextBox").

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

我的问题

到底他妈发生了什么?这是设计使然吗?这是浏览器的问题吗?我发现错误了吗?令人讨厌的是,我必须有一些额外的 JavaScript 才能在页面加载时禁用文本框的可写性,以使我的应用程序正常工作。

谢谢!

4

2 回答 2

3

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

MyControl.Attributes.Add("readOnly","readOnly")
于 2009-06-30T13:12:30.197 回答
0

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

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

我不认为这是一个错误。我认为这是有意的,将某些东西完全锁定 - 在服务器端挂起的只读似乎确实是一个首选。

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

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

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

这样,您就不会重写很多标记,而且它是一个快速的 JS 修复程序。

于 2009-06-29T23:41:17.520 回答