Podczas pisania formantu niestandardowego jest on zawsze renderowany jako element zakresu HTML. Jak mogę to zmienić na przykład na div?Jak zmienić zachowanie renderowania kontrolki niestandardowej z rozpiętości
Odpowiedz
Wyprowadź swoją kontrolę z WebControl następująco:
public class MyCustomControl : WebControl {
public MyCustomControl() : base(HtmlTextWriterTag.Div) {}
}
Oznacza to, użyć konstruktora klasy bazowej, która akceptuje tag do użycia.
Zazwyczaj mam własną klasę podstawową, z której dziedziczą wszystkie moje złożone elementy sterujące. Jedną z właściwości, które dodaję do tego, jest ContainerElement. Wyeksponowany publicznie programista może wybrać dowolny element zewnętrzny, jakiego oczekują. Wewnętrznie ustawia właściwość TagKey, która reguluje to renderowanie w formancie podstawowym. Wszystkie poniższe elementy do kontroli/klasy bazowej.
Wystarczy ustawić HTMLContainerElement, który będzie miał inteli-pomoc dla wszystkich elementów w wyliczeniu HtmlTextWriterTag.
/// <summary>
/// Local variable for storing what the container element for the rendered control will be.
/// </summary>
private HtmlTextWriterTag hosTagKey = HtmlTextWriterTag.Span;
/// <summary>
/// HTMLContanerElement is the tag key used to set the controls outer html control which appears in the markup.
/// The default is a span, but you can change this to be any HTML control you choose.
/// </summary>
public HtmlTextWriterTag HTMLContainerElement
{
get { return this.hosTagKey; }
set { this.hosTagKey = value; }
}
/// <summary>
/// Makes it so this control is a "div" element instead of the
/// standard "span" element.
/// </summary>
protected override HtmlTextWriterTag TagKey
{
get { return this.hosTagKey; }
}
Jeśli pochodzą z CompositeControl nie ma konstruktora, który pobiera typ tagu. Można zastąpić TagKey (nie próbowałem go), ale bardziej elastyczną opcją jest przesłonięcie metody RenderBeginTag i sprawienie, aby działała zgodnie z oczekiwaniami. Klasa podstawowa renderuje element otwierający "zakres", ale nie trzeba wywoływać metody klasy bazowej. Nie musisz niczego wywoływać, jeśli nie chcesz, aby coś zostało wyrenderowane (w takim przypadku również przesuń RenderEndTag i nie wywołuj niczego w tym miejscu). Na przykład,
public override void RenderBeginTag(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Class, "reportViewer");
writer.AddAttribute(HtmlTextWriterAttribute.Id, "QueryViewerWrapper");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
}
Ten kod wytwarza
<div class="reportViewer" id="QueryViewerWrapper">
który jest dokładnie to, co potrzebne do tego konkretnego kompozytowego kontroli kopalni, div z klasą zawinąć kontrolę ReportViewer. Dołączam identyfikator tylko po to, aby łatwiej było znaleźć wyjście.
+1 overrode tagKey i działa dobrze – Maslow