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基础架构,不打算直接从代码中使用
因此,用下划线替换$
似乎是正确的答案