2012-11-21 20 views
6

コードの後ろから特定のWebページにいくつかのコンテンツを追加します。HtmlGenericControl( "br")レンダリング2回

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

、PDOCは私がコンテンツを追加しているいるPanelです:私はいくつかのテキストの後にブレークを追加したい場合は、私はこの方法でそれを行うようにしてください。しかし、最後のHTMLに2つのbrタグが追加されます。

私は、この動作をこのように避けてきました:

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>タグはありませんので、2個の<br />タグがあるとして、ブラウザがそれを示しています。このうちニースの方法は、(C#のコードのために申し訳ありませんが、あなたはVB.NETでこれをrewrittingと全く問題はないはずです)このようなHtmlGenericSelfCloseControlを作成することです:

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

@リチャードディスディングおそらくはい、私はちょうど私のプロジェクトの1つでこのコードを書いていましたが、リファクタリングを考慮せずに貼り付けました。 – tpeczek

+0

Page.ParseControl( "br")は私にとっては機能しません。 Page.ParseControl( "
")が機能します。 – JJS

21

実際にあなたが使用することができます。 new HtmlGenericControl("br")一方

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

は、あなただけの1つのスペースラインを持っているように、これが唯一のあなたのHTMLに<br/>タグを追加する、2 <br>を追加します。 この写真では、そのコードブロックでこれらのブレークを追加しました。

enter image description here

また、ここで同様の質問:Server control behaving oddly

+0

あなたの答えをありがとう。それはうまく動作します。私はupvotingですが、正しい答えとしてマークしていないのは、以前の質問を自分の質問にもっと具体的に考えるからです。 – adripanico