2012-11-21 165 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不支持自動關閉。在服務器端HtmlGenericControl("br")被視爲:

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

有HTML中沒有</br>標籤,所以瀏覽器顯示它有兩種<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

其實你可以使用;

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

new HtmlGenericControl("br")增加了兩個<br>,這隻會增加<br/>標記您的HTML,這樣你只需要1條線。 在這幅圖中,我添加了那些代碼塊的中斷。

enter image description here

而且類似的問題在這裏:Server control behaving oddly

+0

感謝您的回答。它工作正常。我是upvoting,但沒有標記爲正確的答案,因爲我認爲前一個更具體到我的問題。 – adripanico