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