检索asp:TextBox的值

Sli*_*lim 4 .net javascript c#

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

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

The*_*TXI 6

使用文本框的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所说,当EnableViewState为false时,他的博客条目ASP.NET 2.0 ReadOnly行为会发生变化.使用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的编程设置值的位置).

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

资源


Rob*_*Rob 5

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

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