C# 当ASP文本框的Id中有$sign时,FindControl方法返回null

C# 当ASP文本框的Id中有$sign时,FindControl方法返回null,c#,asp.net,textbox,clientid,C#,Asp.net,Textbox,Clientid,我写信给你是因为我想了解正在发生的事情 在我的代码中,我将控件动态添加到System.Web.UI.WebControls.GridView(我扩展了它)。在页面上执行某些操作后,我将检查page.Request[“\u EVENTTARGET”]中的控件ID是否是我先前在ViewState中保存的ID 在.NET3.5上,一切正常,但在将我的项目切换到.NET4之后,这就不起作用了,因为Page.Request[“\u EVENTTARGET”]返回Inherit ClientId,并且我在V

我写信给你是因为我想了解正在发生的事情

在我的代码中,我将控件动态添加到
System.Web.UI.WebControls.GridView
(我扩展了它)。在页面上执行某些操作后,我将检查
page.Request[“\u EVENTTARGET”]
中的控件ID是否是我先前在ViewState中保存的ID

在.NET3.5上,一切正常,但在将我的项目切换到.NET4之后,这就不起作用了,因为
Page.Request[“\u EVENTTARGET”]
返回Inherit ClientId,并且我在ViewState中只保留了我控件的短Id。我使用
Page.FindControl
方法修复了它。它适用于链接按钮、按钮和下拉列表,但不适用于文本框,因为
Page.Request[“\uu EVENTTARGET”]
返回我的文本框的名称

因此,我将文本框的ClientMode更改为静态,如
'string$string'
。但是仍然
Page.FindControl
返回空值。我已经读到,如果TextBox是动态生成的,并且嵌套在一些控件中,那么这个方法就无法找到它

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

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

但后来我将文本框的Id从
string$string
更改为“string\u string”,它开始工作正常(我的文本框的值就是我写的)

这是我的第二个问题。为什么美元($)符号会导致我看到旧值


谢谢

ID属性中的
$
字符无效。有关更多信息,请参阅

具体来说,

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

另外,请参见关于
IdSeparator
属性的信息

具体而言:

此API支持.NET Framework基础架构,不打算直接从代码中使用

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