禁用文本框丢失视图状态

Posted

技术标签:

【中文标题】禁用文本框丢失视图状态【英文标题】:Disabled textbox losses viewstate 【发布时间】:2011-09-13 01:40:43 【问题描述】:

我正在根据选择的下拉菜单动态生成表单。 该表单由字段(十进制值的数据输入+几个文本字段)组成。必须在末尾添加所有十进制值并使用该值更新 Total TextBox。总文本框已禁用。

当我在用户输入他们的值后单击表单上的保存按钮时,除了禁用的文本框外,整个表单都保留在视图状态中。当我启用文本框时,一切正常。请注意,我正在动态生成表单并使用 javascript 更新总文本框的值来计算(添加所有小数字段)。

附:我正在做一切正确的事情来保持视图状态。

那么启用/禁用对视图状态有何影响

【问题讨论】:

【参考方案1】:

基本上,我添加了两个语句来让它工作。

txtBox.Attributes.Add("readonly", "readonly");
txtBox.Style.Add("color","gray");

当我使用 txtBox.Enabled = false 时,它​​不会保留视图状态,而是在我的代码隐藏页面中使用上述两个语句来替代它

【讨论】:

关于我不久前发布的问题的更多信息:***.com/questions/1060518/… @DotNetInfo,但是如果 intellisense 无法访问“txtBox”控件怎么办,因为它位于 DetailsView 或 GridView 的深处。不幸的是 FindControl("txtBox") 总是在 page_load 中返回 null。【参考方案2】:

是的,禁用的表单元素不会将其值发送到服务器端,您可以查看请求标头。禁用的元素未出现在“get”或“post”集合中。

如果要设置用户不能编辑,可以设置为只读。

【讨论】:

【参考方案3】:

在页面上添加javascript:

function enableTextBoxes() 
            $("input[type='text'][disabled='disabled']").removeAttr("disabled");
        

并添加到服务器代码(在 Page_Load、PreRender 或其他方法中)

ClientScript.RegisterOnSubmitStatement(typeof(Page), "enableTextBoxes", "enableTextBoxes();");

如果您使用 UpdatePanels,则使用 ScriptManager.RegisterOnSubmitStatement 方法

【讨论】:

我之前已经尝试过,但没有成功。基本上,文本框显示为禁用状态,但回发时未设置该值。文本框显示没有值。我使用了 ("readonly", "readonly") 属性,它工作正常,但在禁用状态下不显示文本框(灰色) @DotNetInfo 您必须首先从文本框控件中删除硬编码 Enabled="false" 或 ReadOnly="true"。【参考方案4】:

请创建自定义文本框,而不是使用实际的文本框实例。

在您的自定义文本框中继承文本框并将此文本框添加到您的动态表单中。

【讨论】:

以上是关于禁用文本框丢失视图状态的主要内容,如果未能解决你的问题,请参考以下文章

如果文本框处于焦点,则禁用 jQuery 事件

文本框放大镜问题 iOS

TextBox Binding TwoWay 直到焦点丢失 WP7 才会更新

jquery禁用文本框

IsEnabled="False" 状态的 WPF 文本框未应用正确的背景颜色

禁用文本框后 JQuery UI 自动完成功能不起作用