2012-09-19 2 views
0

간단한 입력 요소가 runat="server"입니다. 이 필드는 두 레이어의 사용자 정의 컨트롤에 중첩되어 있으며 getter로 ID를 가져 오지만 주어진 ID는 생성 된 전체 ID가 아닙니다.ASP.Net 3.5 ClientID 문제

//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은 UserControl2의 ControlCollection 인스턴스에 'c'를 추가하지 않는다는 것을 기억합니다. ClientId가 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; 
}