由于UniqueID更改,动态控件中的文本框的文本在发回时未设置

本文关键字:文本 设置 动态控件 UniqueID 由于 更改 | 更新日期: 2023-09-27 18:13:03

正如标题所示,我们在返回后获得文本框的正确文本值时遇到问题。

背景:

  • 文本框称为textbox_registration
  • 文本框在一个动态加载的控件中。
  • 动态控件被重新创建,并在OnInit事件中有它的数据集。
  • 动态控件在UpdatePanel中的PlaceHolder中。

预计表单中提交的值将出现在文本框的Text属性中。第一个表单提交很好,然后变得很奇怪。textbox_registration的UniqueID在随后的每次提交中都会更改,从而破坏了存储在Text属性中的期望值。文本框的unique id示例如下:

ctl00 CollapsableSidebar panel_editAsset美元ctl01 textbox_registration美元ctl00 CollapsableSidebar panel_editAsset美元ctl02 textbox_registration美元

我的理论是,当动态控件加载在init再次它避免碰撞与文本框的前一个实例通过改变生成的UniqueID,然后当第二次post回发生的ID必须是不同的,从而破坏ViewState初始化之间的init和load方法。

这是非常恼人的,因为查看请求。表单收集我可以看到正确张贴的值。

如何检索textbox_registration.Text的张贴值?

编辑1 :只是为了澄清textbox_registration是一个普通的静态ASP文本框在UserControl中,我们已经动态加载。

编辑2 :为了概述该场景,源代码被简化为以下文件:

  • Item Page,显示项目的页面。
  • 编辑窗格,项目页面上的自定义UserControl,用于加载动态控件。
  • 动态控件,加载到编辑窗格中的动态项编辑控件的示例。
  • 编辑控件必须实现的接口。

由于UniqueID更改,动态控件中的文本框的文本在发回时未设置

创建TextBox控件时尝试设置ClientIDMode属性

textbox_registration.ClientIDMode = ClientIDMode.Static;

当您想要检索文本

var textBox = (TextBox)this.Form.FindControl("textbox_registration");
var textBoxText = textBox.Text;

经过调查,这是一个逻辑错误导致的问题。

因为编辑控件是动态加载的,所以在OnInit结束或OnLoad之前加载该控件是很重要的,只要在Controls.Add()调用之前加载该控件。

在此基础上,对动态控制中的OnInit事件进行了深入研究。在后台被调用了两次 !逻辑错误!这导致控件被创建两次,并且提交的表单值对应于第一次OnInit调用中创建的控件。因此,第二个OnInit调用为控件生成了不同的uniqueid。当ViewState恢复时,控件不存在。

解决方案是确保控件在每次发布后都像第一次创建时一样正确创建。第一次没有复制控件,所以第二次也不应该!

原来回顾一下"动态控制基础101"是必要的。这个链接"动态控制在ASP中变得很容易"。Net’最终使解决方案点击成为焦点