2012-11-21 3 views
6

코드 뒤에있는 특정 웹 페이지에 일부 내용을 추가하려고합니다. 나는 텍스트 후 휴식을 추가 할 때, 나는 이런 식으로 그렇게하려고 : 나는 내용을 추가 해요있는 HtmlGenericControl ("br") 렌더링 두 번

pDoc.Controls.Add(New Label With {.Text = "whatever"}) 
pDoc.Controls.Add(New HtmlGenericControl("br")) 

, pDoc가 Panel입니다. 그러나 두 개의 br 태그가 최종 HTML에 추가됩니다.

나는이 문제를 이런 식으로 피했습니다 :

pDoc.Controls.Add(New Label With {.Text = "whatever" & "<br />"}) 

어쨌든, 난 너무 궁금하고 나는

pDoc.Controls.Add(New HtmlGenericControl("br")) 

그런 식으로 행동하는 이유를 알고 싶어요. 나는 나의 접근 방식이 너무 멋지지 않다고 생각한다. 그 이유처럼 보이는 몇 가지 테스트 후

감사합니다,

+1

있습니까? – tpeczek

+0

네, 맞습니다.

답변

5

HtmlGenericControl자기 폐쇄을 지원하지 않는다는 것입니다.

<br runat="server"></br> 

는 HTML에는 </br> 태그가 없기 때문에 두 <br /> 태그 있기 때문에 브라우저가 그것을 보여줍니다으로 서버 측의 HtmlGenericControl("br") 처리됩니다. 이 중 좋은 방법은이 같은 HtmlGenericSelfCloseControl 만드는 것입니다 (C# 코드에 대한 미안하지만 당신은 VB.NET에서이 rewritting 어떠한 문제가 없을 것) :

public class HtmlGenericSelfCloseControl : HtmlGenericControl 
{ 
    public HtmlGenericSelfCloseControl() 
     : base() 
    { 
    } 

    public HtmlGenericSelfCloseControl(string tag) 
     : base(tag) 
    { 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write(HtmlTextWriter.TagLeftChar + this.TagName); 
     Attributes.Render(writer); 
     writer.Write(HtmlTextWriter.SelfClosingTagEnd); 
    } 

    public override ControlCollection Controls 
    { 
     get { throw new Exception("Self closing tag can't have child controls"); } 
    } 

    public override string InnerHtml 
    { 
     get { return String.Empty; } 
     set { throw new Exception("Self closing tag can't have inner content"); } 
    } 

    public override string InnerText 
    { 
     get { return String.Empty; } 
     set { throw new Exception("Self closing tag can't have inner text"); } 
    } 
} 

를 대신 사용 :

pDoc.Controls.Add(New Label With {.Text = "whatever"}) 
pDoc.Controls.Add(New HtmlGenericSelfCloseControl("br")) 

간단한 대안 (당신이 Page 참조가있는 경우)로서 당신은 Page.ParseControl를 사용하여 시도 할 수 있습니다 :

pDoc.Controls.Add(New Label With {.Text = "whatever"}) 
pDoc.Controls.Add(Page.ParseControl("br")) 
+0

'HtmlControl'에서 상속하기가 쉽지 않을까요? XHTML 스타일의 자체 닫는 태그를 원한다면 생성자와 RenderAttributes 만 재정의하면된다. –

+0

@RichardDeeming 거의 확실합니다. 예전에이 코드를 프로젝트 중 하나에서 작성한 후 리팩토링을 고려하지 않고 붙여 넣었습니다. – tpeczek

+0

Page.ParseControl ("br")이 작동하지 않습니다. Page.ParseControl ("
")가 작동하지 않습니다. – JJS

21

가 실제로 사용할 수있는, 당신은 단지 하나 개의 공간 라인을 가질 수 있도록 new HtmlGenericControl("br") 반면

pDoc.Controls.Add(new LiteralControl("<br/>")); 

<br>, 이것은 단지 당신의 HTML에 <br/> 태그를 추가합니다을 추가합니다. 이 그림에서 나는 그 코드 블록으로 그 휴식을 추가했다. 여기

또한

enter image description here

비슷한 질문 : 당신이`

`하지`

`렌더링되어 있는지 Server control behaving oddly

+0

답변 해 주셔서 감사합니다. 그것은 잘 작동합니다.나는 upvoting,하지만 정답으로 표시하기 때문에 이전 질문을 내 질문에 더 구체적으로 고려해야합니다. – adripanico