Wenn ein benutzerdefiniertes Steuerelement geschrieben wird, wurde es immer als ein HTML-Span-Element gerendert. Wie kann ich es zum Beispiel zu einem Div ändern?Wie ändere ich das Renderverhalten meines benutzerdefinierten Steuerelements von einem Bereich
Antwort
leiten Ihre Steuerung von WebControl wie folgt:
public class MyCustomControl : WebControl {
public MyCustomControl() : base(HtmlTextWriterTag.Div) {}
}
Das heißt, das Basisklassenkonstruktor verwenden, die den Tag verwenden akzeptiert.
Ich habe normalerweise meine eigene Basisklasse, von der alle meine zusammengesetzten Steuerelemente erben. Eine der Eigenschaften, die ich hinzufüge, ist ein ContainerElement. Öffentlich exponiert, kann der Entwickler wählen, welches äußere Element er will. Intern wird die TagKey-Eigenschaft festgelegt, die dieses Rendering für das Basissteuerelement steuert. Alle folgenden zu Ihrer Kontrolle/Basisklasse.
Sie müssen nur HTMLContainerElement, die die Intel-Hilfe aller Elemente in der HtmlTextWriterTag-Enumeration haben.
/// <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; }
}
Wenn Sie von Composite ableiten gibt es keinen Konstruktor, der einen Tag-Typ nimmt. Sie können TagKey überschreiben (ich habe es noch nicht ausprobiert), aber eine flexiblere Option besteht darin, die RenderBeginTag-Methode zu überschreiben und zu tun, was Sie wollen. Die Basisklasse rendert ein öffnendes Element "span", aber Sie müssen die Basisklassenmethode nicht aufrufen. Sie müssen nichts aufrufen, wenn Sie nichts gerendert haben wollen (in diesem Fall überschreiben Sie auch RenderEndTag und rufen dort auch nichts auf). Zum Beispiel
public override void RenderBeginTag(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Class, "reportViewer");
writer.AddAttribute(HtmlTextWriterAttribute.Id, "QueryViewerWrapper");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
}
Dieser Code erzeugt
<div class="reportViewer" id="QueryViewerWrapper">
das ist genau das, was ich für diese spezielle Verbund Kontrolle von mir benötigt, ein div mit einer Klasse ein Reportviewer-Steuerelement wickeln. Ich füge die ID hinzu, um die Ausgabe einfacher zu erkennen.
+1 TagKey überschreiben und es funktioniert gut – Maslow