Frage

Ich schreibe die RenderContents() Methode meiner ASP.NET Server-Steuerelement. Das Verfahren verwendet ein HtmlTextWriter Objekt an den Ausgabeinhalt zu machen. Für die Steuerung ich schreibe, scheint die HtmlTextWriter Methoden verwenden wie es wird eine Menge von Zeilen Code erfordern jeden Tag und fügen Sie alle Attribute in den Stream zu öffnen und zu schließen. Am Ende habe ich das Gefühl, dass ich mit dem Code, um am Ende werde, die viel länger ist, als es sein muss.

ich dachte, dass wenn ich eine verkettbar Klasse wie StringBuilder verwendet, würde mein Code viel sauberer sein zu lesen und leichter zu schreiben.

Was ich habe mich gefragt war, gibt es keinen Grund, die HtmlTextWriter Objekt zu verwenden, um meine gesamte Kontrolle des Inhalts zu machen? Anders als bei den Sicherheitskontrollen (Ich gehe davon aus) es Sie sicherstellen, dass nicht schreiben Tags in der falschen Reihenfolge oder ungültige Markup erstellen, ich einen Grund, nicht sehen.

Es scheint, als wäre es einfacher zu sein, nur so etwas zu tun:

protected override void RenderContents(HtmlTextWriter output)
{
    StringBuilder s = new StringBuilder();
    s.Append("lots")
     .Append("of")
     .Append("strings");

    output.BeginRender();
    output.Write(s.ToString());
    output.EndRender();
}

Gibt es einen Grund, warum dies eine schlechte Idee wäre?

Aktualisieren
Als Reaktion auf Mehrdad Afshari 's Antwort:
 Ich glaube nicht, viel über die Speicheranforderungen von instanziiert ein separates StringBuilder Objekt mit. Was ist ein Wrapper für Htmltextwriter zu machen, so dass es so verkettet werden kann, dass eine zusätzliche Zeichenkette nicht gemacht wird.

public class ChainedHtmlTextWriter
{
    private HtmlTextWriter _W;
    public ChainedHtmlTextWriter(HtmlTextWriter writer)
    {
        _W = writer;
    }

    public ChainedHtmlTextWriter Write<T>(T value) 
    { 
        _W.Write(value); 
        return this; 
    }

    public ChainedHtmlTextWriter WriteLine<T>(T value)
    {
        _W.WriteLine(value);
        return this;
    }
}
War es hilfreich?

Lösung

Ich arbeite an einer Anwendung, wo die Entwickler den schrecklichen Weg beschritten Sie erkunden. Diese harkens zurück zu den Tagen, wenn Sie hatten Ihren eigenen ISAPI DLLs zu schreiben, die HTML-Code ausspucken. Es ist ein ständigen Kopfschmerzen zu arbeiten. Wenn der Code meist Strings sind, dann stimmt etwas nicht.

Die meisten der Code dieser Art, die ich ich Server ändern Objekte instanziiert, konfigurieren Sie ihre Eigenschaften wie gewünscht, und dann sagen sie zu .RenderControl (Drehbuch). Dies macht den Code viel leichter zu lesen und zu arbeiten. Wenn eine Leistung dort aus dem Kopf das bringt getroffen, ich bin bereit, es zu akzeptieren (in der Tat, wird die Anwendung der Regel schneller, nachdem ich meine Änderungen vorgenommen habe, so anekdotisch ist dies nicht der Fall ist, aber ich habe nicht profiliert mein Code).

Ein einfacher Nachteil Hartcodierung Ihre Sachen in der Strings ist, wenn HTML-Standards ändern. Der Code, den ich auf Arbeit wurde in 04/05 geschrieben, und seitdem hat
worden
und Groß HTML-Tags sind nicht mehr rein, etc. Wenn sie mit Serversteuer worden sind, wird dieser Server-Steuerelemente geändert ihre ausgegeben html, ohne uns etwas tun zu müssen. Dies ist nur ein einfaches Beispiel.

EDIT: Oh, und btw, Beginrender und EndRender haben keine Umsetzung. Sie sind Platzhalter für Sie benutzerdefinierte Funktionen in einem Htmltextwriter abgeleitete Klasse außer Kraft zu setzen und zu liefern.

EDIT2: Manchmal ist es ein bisschen schwer zu immer Verwendung Server-Steuerelemente, wie für Container und Sachen. Ich würde tun, viele .Controls.Add () und dann die Container später machen. Also manchmal ich dies tun:

writer.AddAttribute(HtmlTextWriterAttribute.Class, "myContainerClass");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
// do some stuff, .RenderControl on some other controls, etc.
writer.RenderEndTag();

Wie bereits erwähnt, wird dies richtig html machen, auch wenn der HTML-Code eines div in der Zukunft ändern, denn ich habe keine hartcodierte Strings.

Andere Tipps

Performance-weise, wird dies mehr String Kopien erfordert getan werden. HtmlTextWriter schreibt direkt an den Ausgabepuffer. StringBuilder auf der anderen Seite, hat seinen eigenen Puffer. Wenn Sie ToString auf der StringBuilder nennen, hat eine neue Zeichenfolge gebaut werden und dann wird es durch output.Write an den Ausgabepuffer geschrieben werden. Es erfordert viel mehr Arbeit getan werden.

Ich glaube nicht, Sie sollten Beginrender / EndRender zu rufen, das ist von der Seite gemacht.

Ich kann nicht sehen, wie String-Builder mit jeder Arbeit sparen würde die HtmlTextWriters eigene Methoden gegenüber der Verwendung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top