【问题标题】:The text of a textbox in a dynamic control is not set on post back due to UniqueID change由于 UniqueID 更改,动态控件中的文本框文本未在回发时设置
【发布时间】:2015-12-12 03:59:33
【问题描述】:

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

上下文:

  • 文本框名为textbox_registration
  • 文本框位于动态加载的控件中。
  • 动态控件会在每次回发时重新创建,并在 OnInit 事件中设置其数据。
  • 动态控件位于 UpdatePanel 内的 PlaceHolder 中。

预计表单中发布的值随后将出现在文本框的Text 属性中。第一次提交表单很好,然后就变得奇怪了。 textbox_registration 的 UniqueID 在每次后续提交中都会发生变化,从而破坏了存储在 Text 属性中的预期值。下面是 Textbox 的 UniqueID 示例。

ctl00$CollapsableSidebar$panel_editAsset$ctl01$textbox_registration ctl00$CollapsableSidebar$panel_editAsset$ctl02$textbox_registration

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

这很烦人,因为在 Request.Form 集合中我可以看到正确发布的值。

如何检索textbox_registration.Text 的发布值?

编辑 1: 澄清一下 textbox_registration 是我们动态加载的 UserControl 中的普通静态 ASP 文本框。

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

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

【问题讨论】:

  • 解决方案是否可以将 textbox_registration (这是一个 asp:Textbox)转换为标准 <input type="text" id="textbox_registration" /> 并使用 Form.Request["textbox_registration"] 来获取值?还是这会引发安全风险、不当行为等?

标签: c# asp.net c#-4.0 web webforms


【解决方案1】:

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

textbox_registration.ClientIDMode = ClientIDMode.Static;

然后当你要检索文本时

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

【讨论】:

  • 我最初对您的回复持怀疑态度。我们已经尝试了您提供的内容,并且 FindControl 返回的文本框与我们已经引用过的文本框相同。 IE。 Object.ReferenceEquals(textBox, textbox_registration) == true。因此我们有相同的(不正确的)文本值。只是为了澄清 textbox_registration 是我们动态加载的 UserControl 中的普通静态 ASP 文本框。
【解决方案2】:

在调查问题后,这是导致问题的逻辑错误。

因为编辑控件是动态加载的,所以只要在调用 Controls.Add() 之前将项目加载到控件中,那么在 OnInit 或直到 OnLoad 结束之前加载回发控件是很重要的.

有了这些知识,在动态控制中对OnInit 事件进行了仔细调查。它在帖子的背面被称为 两次!逻辑错误!这导致控件被创建两次,并且发布的表单值对应于在第一次 OnInit 调用中创建的控件。因此,第二个 OnInit 调用为控件生成了不同的 UniqueID。当 ViewState 恢复时,控件不存在。

解决方案是确保每次回帖都像第一次创建控件一样正确创建控件。第一次没做重复控件,第二次也不行!

原来需要回顾一下“动态控制基础知识 101”。 这个链接'Dynamic Controls Made Easy in ASP.Net'终于让解决方案成为焦点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多