CompositeControl에서 상속받은 작은 ASP.Net 사용자 지정 컨트롤을 작성하고 있습니다. 이 컨트롤은 각 서브 패널에 레이블이있는 두 개의 서브 패널을 포함하는 패널 일뿐입니다. 렌더링 될 때 HTML 소스에서 내 사용자 지정 컨트롤의 첫 번째 자식 컨트롤이 두 개의 id 특성을 갖게됩니다. 첫 번째 요소는 사용자 지정 컨트롤 자체의 ID이고 두 번째 요소는 첫 번째 자식 컨트롤에 할당 한 ID 속성입니다. 왜 이런 일이 일어나는 걸까요?내 ASP.Net 사용자 지정 컨트롤이 첫 번째 자식 컨트롤에 두 개의 id 특성을 렌더링하는 이유는 무엇입니까?
코드 : ASPX 페이지에서
[ToolboxData("<{0}:MessageBox runat=server></{0}:MessageBox>")]
public class MessageBox : CompositeControl {
private Panel _MessageHeaderContainer = null;
private Label _MessageHeaderLabel = null;
private Panel _MessageDetailsContainer = null;
private Label _MessageDetailsLabel = null;
protected override HtmlTextWriterTag TagKey {
get {
return HtmlTextWriterTag.Div;
}
}
protected override void CreateChildControls() {
// Message header area.
_MessageHeaderContainer = new Panel();
_MessageHeaderContainer.ID = "HeaderContainer";
_MessageHeaderContainer.CssClass = "__MessageBox_Container";
this.Controls.Add(_MessageHeaderContainer);
// Message header text.
_MessageHeaderLabel = new Label();
_MessageHeaderLabel.ID = "HeaderLabel";
_MessageHeaderLabel.Text = "[ Header ]";
_MessageHeaderContainer.Controls.Add(_MessageHeaderLabel);
// Message details area.
_MessageDetailsContainer = new Panel();
_MessageDetailsContainer.ID = "DetailsContainer";
this.Controls.Add(_MessageDetailsContainer);
// Message details text.
_MessageDetailsLabel = new Label();
_MessageDetailsLabel.ID = "DetailsLabel";
_MessageDetailsLabel.Text = "[ Details ]";
_MessageDetailsContainer.Controls.Add(_MessageDetailsLabel);
}
protected override void RenderContents(HtmlTextWriter output) {
AddAttributesToRender(output);
// Render the box.
_MessageHeaderContainer.RenderControl(output);
_MessageDetailsContainer.RenderControl(output);
}
}
사용법 :
<cc:MessageBox ID="ctlMessageBox" runat="server" />
HTML 출력 :
<div id="ctl00_ctl00_ctlMessageBox">
<div id="ctl00_ctl00_ctlMessageBox" id="ctl00_ctl00_ctlMessageBox_HeaderContainer" class="__MessageBox_Container">
<span id="ctl00_ctl00_ctlMessageBox_HeaderLabel">[ Header ]</span>
</div><div id="ctl00_ctl00_ctlMessageBox_DetailsContainer">
<span id="ctl00_ctl00_ctlMessageBox_DetailsLabel">[ Details ]</span>
</div>
</div>
컨트롤 자체에 할당 된 속성 (즉, this.CssClass = "xxxx")이 컨트롤의 가장 바깥 쪽 자동 생성 div 태그와 첫 번째 자식 컨트롤의 렌더링 된 div 태그에 할당되는 것처럼 보입니다. –
Render 함수에서 AddAttributesToRender (출력) 행을 제거하면 루트 태그의 모든 특성을 첫 번째 자식에 추가하는 작업이 중단됩니다. AddAttributesToRender 함수의 요점은 무엇인지 잘 모르겠습니다 ... 누군가이 함수를 호출하는 이유에 대해 나에게 계몽 할 수 있습니까? –
사용자 정의 컨트롤 렌더링 방법을보다 세부적으로 제어하려면이 함수를 호출하십시오. 사용자 지정 컨트롤 (ASPX 태그 및 기타 소스의 스타일 등)에 할당되어야하는 특성을 렌더링 될 다음 태그에 추가합니다. ASP.NET이 렌더링을 처리하게하므로 필요하지 않습니다. Render 메서드를 재정의하면 (예와 같이) 필요할 것입니다. –