【发布时间】:2009-04-29 15:49:11
【问题描述】:
我有一个禁用的文本框,我正在使用 JavaScript 在客户端编辑它的值。当我尝试在服务器端检索值时,它不会反映在客户端所做的更改。如果我将 TextBox 的 enabled 属性设置为 true,我可以检索该值,但用户可以将焦点放在并编辑 TextBox。
有没有一种合理的方法可以防止用户将焦点和编辑放在 TextBox 上?
【问题讨论】:
标签: c# .net javascript
我有一个禁用的文本框,我正在使用 JavaScript 在客户端编辑它的值。当我尝试在服务器端检索值时,它不会反映在客户端所做的更改。如果我将 TextBox 的 enabled 属性设置为 true,我可以检索该值,但用户可以将焦点放在并编辑 TextBox。
有没有一种合理的方法可以防止用户将焦点和编辑放在 TextBox 上?
【问题讨论】:
标签: c# .net javascript
使用文本框的 ReadOnly 属性。
编辑:根据 OP 的评论,这可能无法解决问题。
编辑 2:来自 DotNetSlackers:
那么这些有什么区别 两个属性,为什么两者都存在? 有两个区别 这两个属性,一个微不足道的 区别和微妙而深刻的区别:
- 这两个属性发出不同的标记。当您设置启用 为 False,TextBox 注入 属性 disabled="disabled" intoits 呈现的 HTML。当您设置 ReadOnly 属性为 True,则 属性 readonly="readonly" 是 注入。
- 根据 HTML 表单的 W3C 规范,禁用的控件不是 “成功”,而只读控件 可能是“成功的”。一个成功的” control 是一个名称/值对 通过发送回浏览器 POST 标头或查询字符串。 因此,禁用的控件不是 发送回 ASP.NET 页面,同时 只读控件可能是,取决于 在用户代理上。 (在我的测试中,两者 IE 6 和 FireFox 1.5 一起发送 只读文本框输入。)
......
如果您在 您可能拥有的 ASP.NET 版本 1.x 找到了 TextBox 的 ReadOnly 属性 并使用它而不是设置 启用为假。你还可以拥有 禁用页面的 ViewState 并设置 只读 TextBox Web 控件的 Text 以编程方式属性,因为 TextBox 值通过 表单提交只读 控制。但是,在 ASP.NET 版本中 2.0,事情发生了一些变化,正如 Rick Strahlin 在他的博客文章中所指出的那样 ASP.NET 2.0 只读行为更改 当 EnableViewState 为 false 时。和 2.0,TextBox控件的ReadOnly属性的行为发生了变化 轻微地。来自技术文档:
当发生回发时,将 ReadOnly 属性设置为 true 的 TextBox 控件的 Text 值发送到服务器,但服务器不处理只读文本框。这可以防止恶意用户更改只读文本值。 Text 属性的值在回发之间保留在视图状态中,除非被服务器端代码修改。
发生的情况是客户端发送 沿着只读的值 TextBox 通过表单值,但 ASP.NET 2.0 引擎不占用 该值并将其分配给文本 回发到 TextBox 的属性 帮助防止恶意用户 更改只读 TextBox 值 他们自己。但这让我们回到 我们之前的问题——如果值 没有在回发中指定(或者是 忽略,在这种情况下)和 ViewState 被禁用,该值将丢失。 哎呀。
Rick 的解决方法是手动 从请求中读取值 标题(这个 .TextBox1.Text = 请求[this.TextBox1.UniqueID];), 这会带来安全风险和 2.0引入的问题 地址。最佳方法是 重新查询数据库中的值 (或者你最初得到的任何地方 以编程方式设置的值 只读文本框)。
这篇博文的寓意是,如果 您有可以使用的只读数据 禁用或只读形式 领域,真的无所谓 无论您是否收到 表单中表单字段的值 提交。没关系 因为你不应该 信任/使用该数据开始 和!如果您有只读数据, 不要从数据流中重新读取它 最终用户可以修改!
【讨论】:
正如您所发现的,浏览器不会将值返回到禁用的输入控件中。解决此问题的最简单方法可能是挂钩表单提交,并在提交表单时重新启用输入;用户将没有机会编辑该值,它应该与请求的其余部分一起发布。
另一种方法可能是将隐藏元素注入表单;这可以由您的脚本维护,镜像显示的值,或者以与上述类似的方式在末尾添加。
【讨论】: