2012-09-19 45 views
0

我有一个简单的输入元素runat="server"。该字段嵌套在几层用户控件中,我用吸气剂拉ID,但给出的ID不是完整的生成ID。ASP.Net 3.5 ClientID Issue

//UserControl2.ascx nested inside of UserControl1.ascx 
... 
<input type="text" runat="server" id="newTextBox" /> 
... 

//UserControl1.ascx.cs nested inside of Page1.aspx 
... 
public string NewTextBoxId; 
protected void UserControl2PlaceHolder_Load(object sender, EventArgs e) 
{ 
    var c = LoadControl("~/Common/Controls/Shared/UserControl2.ascx"); 
    NewTextBoxId = ((App.Common.Controls.Shared.UserControl2) c).newTextBox.ClientID; 
} 

的问题是,NewTextBoxId被设置为“newTextBox”,而不是完全生成“ct100_ct100_MainContent_etc._newTextBox”。输入的ID在HTML中正确呈现,但NewTextBoxId设置不正确。为了让事情变得更奇怪,输入的ID在本地实例上呈现为“newTextBox”,但是当我部署到我们的登台服务器时,它在HTML中呈现为“ct100_ct100 ..._ newTextBox”。对此有何想法?

+0

从我记得LoadControl不会将'c'添加到UserControl2的ControlCollection实例。你有没有尝试过将它添加到ControlCollection(它将初始化控件)后获取ClientId? –

+0

@KenHenderson先生,你是我的英雄。在将控件添加到PlaceHolder之前,我拉动了ClientID。非常感谢。继续添加下面的答案,我会接受它。 :) – Joe

+0

没问题。动态控件可能有点有趣。 –

回答

1

正如我的评论所述。在致电c.ClientID之前,必须将LoadedControl c添加到当前控件的ControlCollection中。添加到ControlCollection会导致c被初始化。

//UserControl2.ascx nested inside of UserControl1.ascx 
... 
<input type="text" runat="server" id="newTextBox" /> 
... 

//UserControl1.ascx.cs nested inside of Page1.aspx 
... 
public string NewTextBoxId; 
protected void UserControl2PlaceHolder_Load(object sender, EventArgs e) 
{ 
    var c = LoadControl("~/Common/Controls/Shared/UserControl2.ascx"); 
    this.Controls.Add(c); 
    NewTextBoxId = ((App.Common.Controls.Shared.UserControl2) c).newTextBox.ClientID; 
}