0

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

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

在 .Net 3.5 上一切正常,但是在将我的项目切换到 .Net 4 后,这不起作用,因为Page.Request["__EVENTTARGET"]返回 Inherit ClientId,并且我在 ViewState 中只保留了我的控件的短 ID。我通过使用Page.FindControl方法修复了它。它适用于 LinkBut​​tons、Buttons 和 DropDowns,但不适用于 TextBoxes,因为Page.Request["__EVENTTARGET"]返回我的 TextBox 的名称...

因此,我将 TextBox 的 ClientIdMode 更改为静态,例如'string$string'. 但仍然Page.FindControl返回null。我读过如果 TextBox 是动态生成的并且它嵌套在某些控件中,则此方法无法找到它。

我的第一个问题。为什么方法Page.FindControl无法找到嵌套的 TextBox,但它可以处理其他控件,如 DropDown 或 LinkBut​​ton?

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

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

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

谢谢 !!

4

1 回答 1

0

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

具体来说,

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

另外,请参阅有关该属性的Microsoft 这篇文章。IdSeparator

具体来说:

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

所以用$下划线代替似乎是正确的答案。

于 2014-11-26T02:12:28.187 回答