2010-09-30 63 views
20

我正在編寫各種ASP.NET服務器控件,並且需要刪除默認包裹我的控件的標籤。我知道您可以將標籤更改爲不同的標籤(如在此問題中,How Do I Change the render behavior of my custom control from being a span),但您如何防止它發生?防止爲ASP.NET服務器控件打包<span>標籤

我從WebControl繼承(也可以從CompositeControl繼承)。

我通常得到:

<span>Control output</span> 

我需要:

Control output 

我重寫RenderContents(HtmlTextWriter的輸出)和的CreateChildControls()方法(在不同的控制)。我的直接需求是使用RenderContents(HtmlTextWriter輸出)方法解決問題。

回答

37

這是怎麼回事?

public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.Write(""); 
    } 

    public override void RenderEndTag(HtmlTextWriter writer) 
    { 
     writer.Write(""); 
    } 
+0

太明顯了!謝謝你的幫助。 – 2010-10-01 05:02:01

+2

輝煌的解決方案:)我實際上對這兩種方法都使用了一個空方法,只是放了一條註釋行來解釋它們爲什麼在那裏。不知道這是否與你的不同,但它寫一個空白的字符串似乎是不必要的。 – William 2011-02-17 18:24:06

+0

這幫助了我很多 - 在我找到完美的解決方案之前,必須閱讀很多'好貼士'。如果可能,會給你多個upvote * g * – 2015-07-03 08:08:52

3

更優雅的方式做,這是通過使用Web控件的contrustor(默認情況下,這被稱爲與HtmlTextWriterTag.Span)

public MyWebControl() : base(HtmlTextWriterTag.Div){} 

,並重寫RenderBeginTag方法來添加自定義屬性或其他的東西:

public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.AddAttribute("class", "SomeClassName"); 
     base.RenderBeginTag(writer); 
    } 
+0

這不能解決問題。雖然這將允許您將跨度更改爲不同的元素,例如您的示例中給出的div,但它不允許您按要求完全移除外部元素。您可以將'HtmlTextWriterTag.Unknown'或一個空字符串傳遞給對'base()'的調用,但是當刪除元素的名稱時,元素的尖括號仍然保留,所以最終會導致無效標記:'<>'。 – Elezar 2014-11-18 17:55:02

1

我遇到了同樣的問題。以我爲例,我重寫方法:

protected override void OnPreRender(EventArgs e) 
    { /* Insert the control's stylesheet on the page */ } 

protected override void RenderContents(HtmlTextWriter output) 
     { /* Control rendering here, <span> tag will show up */ } 

爲了防止這種情況,我簡單地更換了RenderContents覆蓋有以下幾點:

protected override void Render(HtmlTextWriter output) 
     { /* Control rendering, no <span> tag */ } 

希望這有助於。

+1

使用渲染而不是RenderContents適用於我。這樣RenderBeginTag/RenderEndTag從來沒有被實際調用過 – Trent 2015-05-10 13:42:29

0

我不認爲接受的答案是完全必要的。我可能是錯的,但渲染方法調用所有三個:

  • RenderBeginTag
  • RenderContents
  • RenderEndTag

所以,你應該能夠只覆蓋渲染和手動調用RenderContents:

protected override void Render(HtmlTextWriter writer) 
{ 
    this.RenderContents(writer); 
} 

有人嗎?也許我錯過了一些東西。我知道這個線程很老,但我最近遇到了這個問題,上面是我的解決方案。