当 $ 符号位于 ASP 文本框的 ID 中时,FindControl 方法返回 null

本文关键字:中时 ID FindControl 方法 null 返回 符号 文本 ASP | 更新日期: 2023-09-27 18:31:54

我写信给你是因为我想了解发生了什么。

在我的代码中,我将控件动态添加到System.Web.UI.WebControls.GridView(我扩展了它)。在页面上执行一些操作后,我正在检查 Page.Request["__EVENTTARGET"] 中的控件的 ID 是否是我之前保存在 ViewState 中的 ID。

在 .Net 3.5 上一切正常,但是将我的项目切换到 .Net 4 后,这不起作用,因为Page.Request["__EVENTTARGET"]返回继承 ClientId,并且我在 ViewState 中只保留了我的控件的短 ID。我使用Page.FindControl方法修复了它。它适用于链接按钮,按钮和下拉列表,但不适用于文本框,因为Page.Request["__EVENTTARGET"]返回我的文本框的名称...

所以我将文本框的客户端 IdMode 更改为静态,就像 'string$string' 一样。但仍然Page.FindControl返回为空。我读过,如果 TextBox 是动态生成的并且它嵌套在某些控件中,则此方法无法找到它。

的第一个问题。为什么方法 Page.FindControl 无法找到嵌套的文本框,但它可以处理其他控件(如下拉列表或链接按钮)?

但我也会处理这个问题。我写了递归类型的Page.FindControl,我可以找到我的文本框。但在这一刻,我又遇到了一个问题。这个文本框的值是旧的(我写了 6,但在 Text 属性中仍然有 1)。我的第一个想法是,这是因为我做得太早了 - 以OnPagePreLoad方法。

但是后来我将文本框的 Id 从 string$string 更改为"string_string",它开始正常工作(我的文本框的值是我写的)。

这是我的第二个问题。为什么美元($)符号,因为我看到了旧值?

谢谢!!

当 $ 符号位于 ASP 文本框的 ID 中时,FindControl 方法返回 null

$ 字符在 ID 属性中无效。 有关详细信息,请参阅此Microsoft文章

具体说来

只有字母数字字符和下划线字符 (_) 的组合才是此属性的有效值。 包含空格或其他无效字符将导致 ASP.NET 页面分析器错误。

另请参阅这篇关于 IdSeparator 属性Microsoft文章。

具体说来:

此 API 支持 .NET Framework 基础结构,不应直接在代码中使用。

因此,用下划线替换$似乎是正确的答案。