2010-09-30 12 views
20

Piszę różne kontrolki ASP.NET Server i muszę usunąć znaczniki, które domyślnie zawijają moje sterowanie. Mam świadomość, że możesz zmienić tag na inny tag (jak w tym pytaniu, How Do I Change the render behavior of my custom control from being a span), ale jak możesz temu zapobiec?Zapobieganie zawijaniu znaczników <span> dla kontroli serwera ASP.NET

Jestem dziedziczenie z WebControl (może również dziedziczyć z CompositeControl).

Zazwyczaj otrzymujemy:

<span>Control output</span> 

muszę:

Control output 

Jestem przesłanianie RenderContents (wyjście HtmlTextWriter) i CreateChildControls() metody (pomiędzy różnymi kontroli). Moja bezpośrednia potrzeba polega na rozwiązaniu problemu przy użyciu metody RenderContents (wyjście HtmlTextWriter).

Odpowiedz

37

Co z tym?

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

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

Zbyt oczywiste! Dzięki za pomoc. –

+2

Doskonałe rozwiązanie :) Właściwie użyłem pustej metody dla obu i po prostu wstawię komentarz wyjaśniający, dlaczego one są. Nie jestem pewien, czy to jest coś innego niż twoje, ale mając go napisać pusty ciąg wydaje się niepotrzebne. – William

+0

To bardzo mi pomogło - musiałem przeczytać wiele "dobrych wskazówek", zanim znalazłem idealne rozwiązanie.Dałoby ci więcej niż jeden los, jeśli to możliwe * g * –

3

bardziej elegancki sposób to zrobić za pomocą contrustor z WebControl (Domyślnie ten nazywany jest z HtmlTextWriterTag.Span)

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

i zastąpić metodę RenderBeginTag dodać niestandardowe atrybuty lub inne rzeczy:

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

To nie rozwiązuje problemu. Chociaż pozwoli to zmienić zakres na inny element, taki jak element div podany w przykładzie, nie pozwala na całkowite usunięcie elementu zewnętrznego zgodnie z wymaganiami. Możesz przekazać w 'HtmlTextWriterTag.UNknown' lub pusty ciąg do wywołania' base() ', ale podczas gdy to usuwa nazwę elementu, nawiasy klamrowe dla elementu są nadal przechowywane, więc kończysz z nieważnym znaczniki: '<>'. – Elezar

1

Wystąpił ten sam problem. W moim przypadku był przesłanianie metod:

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

i

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

Aby temu zapobiec, po prostu zastąpiła RenderContents nadpisanie z następujących czynności:

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

nadzieję, że to pomaga.

+1

Korzystanie z Renderowania zamiast RenderContents działa dla mnie. W ten sposób RenderBeginTag/RenderEndTag nigdy nie jest wywoływany – Trent

0

Nie sądzę, że zaakceptowana odpowiedź jest całkowicie niezbędna. Mogę się mylić, ale czynią metoda zwraca wszystkie trzy:

  • RenderBeginTag
  • RenderContents
  • RenderEndTag

więc powinieneś być w stanie po prostu zastąpić renderowanie i ręcznie RenderContents zadzwonić:

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

Ktoś? Może coś mi brakuje. Wiem, że ten wątek jest stary, ale wpadłem na to ostatnio, że powyższe było moim rozwiązaniem.

Powiązane problemy