2012-11-21 17 views
6

Dodaję treść do podanej strony z kodu. Gdy chcę dodać przerwę po jakimś tekstem, staram się zrobić to w ten sposób:HtmlGenericControl ("br") renderowanie dwa razy

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

, gdzie pDoc jest Panel w którym Dodaję zawartość. Ale dodaje dwa znaczniki br do ostatecznego HTML.

mam tego uniknąć w ten sposób:

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

W każdym razie, jestem tak ciekawa i chcę wiedzieć dlaczego

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

działa w ten sposób. Myślę też, że moje podejście nie jest zbyt fantazyjne.

Pozdrawiam,

+1

Czy jesteś pewien, że to jest świadczenie '

' nie ''

? – tpeczek

+0

tak, on ma rację, to jest renderowanie

Odpowiedz

5

po pewnym testowania to wygląda to dlatego, że HtmlGenericControl nie obsługuje samodzielne zamykanie. Na stronie Serwer HtmlGenericControl("br") traktowany jest jako:

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

Nie ma </br> tag HTML, więc przeglądarka pokazuje go jako istnieją dwie <br /> tagi. Dobry sposób na to, aby tworzyć HtmlGenericSelfCloseControl tak (przepraszam za kod C#, ale nie powinno być problemu z rewritting to w VB.NET):

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"); } 
    } 
} 

i używać go zamiast:

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

jako alternatywę prostszą (jeśli masz odniesienie do Page) można spróbować użyć Page.ParseControl:

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

Czy nie byłoby łatwiej dziedziczyć po 'HtmlControl'? Wtedy potrzebujesz konstruktora i prawdopodobnie przesłonięcia 'RenderAttributes', jeśli chcesz samozamykający się styl XHTML. –

+0

@RichardDeeming Najprawdopodobniej tak, właśnie napisałem ten kod jakiś czas temu w jednym z moich projektów i wkleiłem go bez zastanawiania się nad refaktoryzacją. – tpeczek

+0

PageParseControl ("br") nie działa dla mnie. PageParseControl ("
") działa. – JJS

21

Właściwie można użyć;

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

Zważywszy new HtmlGenericControl("br") dodaje dwa <br>, to będzie tylko dodać <br/> tag HTML tak, że wystarczy 1 linia odstępu. Na tym obrazku dodałem te przerwy z tym blokiem kodu.

enter image description here

podobne pytanie tutaj: Server control behaving oddly

+0

Dzięki za odpowiedź. To działa dobrze.Aktualizuję, ale nie oznaczam jako poprawnej odpowiedzi, ponieważ uważam poprzednią, która jest bardziej specyficzna dla mojego pytania. – adripanico

Powiązane problemy