检索asp:TextBox的值

我有一个禁用的TextBox,我正在使用JavaScript编辑客户端的值。 当我尝试在服务器端检索值时,它不反映客户端上所做的更改。 如果我将TextBox的enabled属性设置为true,我可以检索该值,但用户可以放置焦点并编辑TextBox。

是否有一种理智的方法来阻止用户对TextBox进行聚焦和编辑?

正如您所发现的,浏览器不会在禁用的输入控件中发布值。 解决此问题的最简单方法可能是挂钩表单提交,并在提交表单时重新启用输入; 用户将没有机会编辑该值,它应该与其余请求一起发布。

另一种方法是将隐藏元素注入表单中; 这可以通过您的脚本维护,镜像显示的值,或者以与上面类似的方式添加到最后。

使用文本框的ReadOnly属性。

编辑 :根据OP的评论,这可能不会做的伎俩。

编辑2 :来自DotNetSlackers:

那么这两个属性之间有什么区别?为什么两者都存在? 这两个属性有两个不同之处,一个微不足道的差异和一个微妙的,深刻的:

  1. 这两个属性发出不同的标记。 将Enabled设置为False时,TextBox会将属性disabled =“disabled”注入渲染的HTML中。 将ReadOnly属性设置为True时,将注入readonly =“readonly”属性。
  2. 根据HTML表单的W3C规范,禁用控件不是“成功”,而只读控件可能“成功”。 “成功”控件是通过POST标头或查询字符串将其名称/值对发送回浏览器的控件。 因此,禁用的控件不会发送回ASP.NET页面,而只读控件可能会发送,具体取决于用户代理。 (在我的测试中,IE 6和FireFox 1.5都沿着只读的TextBox输入发送。)

……

如果您在ASP.NET版本1.x中遇到此问题,您可能已找到TextBox的ReadOnly属性并使用它而不是将Enabled设置为False。 您仍然可以禁用页面的ViewState并以编程方式设置只读TextBox Web控件的Text属性,因为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的Text属性以帮助防止恶意用户自己更改只读TextBox值。 但是这会让我们回到我们之前的问题 – 如果在回发中未指定值(或在这种情况下被忽略)并禁用ViewState,则该值将丢失。 EEP。

Rick的工作方式是手动读取请求头中的值(此.TextBox1.Text = Request [this.TextBox1.UniqueID];),这会带来安全风险并引入2.0地址的问题。 最佳方法是重新查询数据库中的值(或者您最初获得只读TextBox的编程设置值的位置)。

这篇博客文章的寓意是,如果您有只读数据,您可以使用禁用或只读表单字段,那么您是否在表单提交中收到表单字段的值并不重要。 这应该没关系,因为您不应该信任/使用该数据开始! 如果您有只读数据,请不要从最终用户可以修改的数据流中重新读取它!

资源