2009-10-21 2 views
2

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> 
+0

컨트롤 자체에 할당 된 속성 (즉, this.CssClass = "xxxx")이 컨트롤의 가장 바깥 쪽 자동 생성 div 태그와 첫 번째 자식 컨트롤의 렌더링 된 div 태그에 할당되는 것처럼 보입니다. –

+0

Render 함수에서 AddAttributesToRender (출력) 행을 제거하면 루트 태그의 모든 특성을 첫 번째 자식에 추가하는 작업이 중단됩니다. AddAttributesToRender 함수의 요점은 무엇인지 잘 모르겠습니다 ... 누군가이 함수를 호출하는 이유에 대해 나에게 계몽 할 수 있습니까? –

+0

사용자 정의 컨트롤 렌더링 방법을보다 세부적으로 제어하려면이 함수를 호출하십시오. 사용자 지정 컨트롤 (ASPX 태그 및 기타 소스의 스타일 등)에 할당되어야하는 특성을 렌더링 될 다음 태그에 추가합니다. ASP.NET이 렌더링을 처리하게하므로 필요하지 않습니다. Render 메서드를 재정의하면 (예와 같이) 필요할 것입니다. –

답변

4

당신은 완전히 RenderContents 방법을 제거하여이 문제를 해결할 수는 - 무엇으로 대체하지 않습니다. 기본적으로 복합 컨트롤은 모든 자식 컨트롤을 렌더링합니다. 이렇게하면 컨트롤 깨끗한 마크 업을 생성합니다

당신이 언급 한 것처럼
<div id="test"> 
    <div id="test_HeaderContainer" class="__MessageBox_Container"> 
    <span id="test_HeaderLabel">[ Header ]</span> 
    </div> 
    <div id="test_DetailsContainer"> 
    <span id="test_DetailsLabel">[ Details ]</span> 
    </div> 
</div> 

AddAttributesToRender 방법은 원인 - 그것은 편리한 방법은 현재의 컨텍스트를인지 (모든 최상위 컨트롤의 속성을 렌더링입니다 최상위 제어 여부). 호출하는 유일한 이유는 렌더링 프로세스를 완전히 제어하고 단일 문에서 최상위 컨트롤의 모든 특성을 렌더링하려는 경우입니다.

+0

+1 - 감사합니다. 매우 유용합니다. –

-1

이것은 ID ASP.NET은 전체적으로 사용자 정의 컨트롤을 할당합니다. Div 또는 Span (사용자 정의 컨트롤 코드 자체가 아니라 마크 업 내에서)에 사용자 지정 컨트롤을 래핑하는 경우 ID는 첫 번째 내부 "컨트롤"대신 할당됩니다. 이 같은

뭔가 :

protected override void Render(HtmlTextWriter writer) 
{ 
    AddAttributesToRender(writer); 

    //must render tag or first inner control will get two IDs 
    writer.RenderBeginTag(HtmlTextWriterTag.Span); 

    //render child controls here... 

    writer.RenderEndTag(); 
} 
+0

"Render the box"주석의 첫 번째 줄에 output.RenderBeginTag (HtmlTextWriterTag.Div)를 추가하고 자식 컨트롤을 렌더링 한 후 적절한 output.RenderEndTag()를 추가하여이 작업을 수행했습니다. 이제 HTML 출력에는 div 태그에 사용자 정의 컨트롤의 "루트"div 태그로 중복 ID가 있습니다. 기본적으로

< child control stuff />
이 있습니다. 렌더링 된 출력에 여전히 중복 컨트롤 ID가 있습니다 - 좋지 않음 –

+1

"RenderControl"이 아닌 "Render"를 다시 시도하십시오. HtmlTextWriterTag TagKey를 제거해보십시오. –

+0

스팬 렌더링을 처음 시도했습니다. 이동하지 않습니다. – sq33G

관련 문제