Was ist der beste Weg, um HTML in C # -Code zu erstellen? [geschlossen]


15

Ich bin der Meinung, dass Markups im Markup und nicht im Code dahinter bleiben sollten.

Ich bin in eine Situation gekommen, in der es meiner Meinung nach akzeptabel ist, den HTML-Code dahinter zu erstellen. Ich hätte gerne einen Konsens darüber, was die besten Praktiken sind oder sein sollten.

Wann ist es akzeptabel, HTML im Code dahinter zu erstellen? Was ist die beste Methode, um dieses HTML zu erstellen? (Beispiel: Strings, StringBuilder, HTMLWriter usw.)


Versuchen Sie es mit Vorlagen und Platzhaltern, in denen Sie diese HTML-Markierungen ausspucken.
Yusubov

5
Eine weitere Option: Erstellen Sie XML auf der Grundlage Ihres Datenmodells und verwenden Sie dann XSLT, um das XML in HTML umzuwandeln.
FrustratedWithFormsDesigner

Ich bin gerade auf C # / XAML für HTML5 aufmerksam geworden, das vielversprechend aussieht und möglicherweise zu Ihrem Szenario passt. cshtml5.com
softveda

Ein Problem mit der XSLT-Route liegt in der Lokalisierung. Wenn Sie zwei Sprachen benötigen, benötigen Sie zwei XSLT-Stylesheets und lassen Sie diese parallel. Das ist die Hölle. Schreiben Sie einfach HTML aus C # in eine Textdatei. Verwenden Sie String.Format und $ ".. {variable} ..." zusammen mit WPFLocalization?
Erik

Antworten:


12

Benutzt sowas Razor hier nicht anwendbar? Denn wenn Sie eine Menge HTML-Generierung mit einer Ansichts-Engine durchführen, kann dies viel einfacher sein. Es wurde auch für die Verwendung außerhalb von ASP.NET entwickelt.

Manchmal ist das jedoch nicht das, was Sie brauchen. Haben Sie darüber nachgedacht, die TagBuilder- Klasse zu verwenden, die Teil von .net (mvc) ist? Es gibt auch den HtmlWriter in System.Web.UI (für Webformulare). Ich würde eines davon empfehlen, wenn du Controlsoder machst Html Helpers.


3
+1, wenn Sie Vorlagen in einem App-Rasierer benötigen, ist der Weg zu gehen. Schauen Sie sich razorengine @ nuget.org/packages/RazorEngine an, wenn Sie eine großartige Option zum Montieren von Rasiermessern in einer non-asp.net-App benötigen.
Wyatt Barnett

1
Ich habe eine ähnliche Anforderung, wo ich HTML (Lasten davon) in einer Klassenbibliothek erzeugen muss. Ich möchte dafür Rasierer verwenden, habe aber Schwierigkeiten zu verstehen, wie man cshtml-Dateien in einer DLL verwaltet. Wie kann es gebündelt werden?
Yashvit

Sie können einfach eine beliebige Zeichenfolge eingeben. Stackoverflow.com/questions/3628895/…
Daniel Little

14

Ich würde das Html Agility Pack verwenden , um HTML zusammenzustellen und es dann in eine Textdatei zu schreiben.

Es wurden viele Arbeitsstunden aufgewendet, um das HTML-Agility-Pack robust und HTML-kompatibel zu machen .

Ich denke, es enthält sogar eine Beispielanwendung, die HTML generiert.

Von der Homepage:

Beispielanwendungen:

Seitenfixierung oder -generierung. Sie können eine Seite nach Ihren Wünschen korrigieren, das DOM ändern, Knoten hinzufügen, Knoten kopieren, also ... Sie geben ihr einen Namen.


5

Ich würde htmltags verwenden , um HTML zu erstellen.

Beispiel:

var tag = new HtmlTag("span")
    .Text("Hello & Goodbye")
    .AddClass("important")
    .Attr("title", "Greetings")

Und dann CSQuery wenn ich HTML analysieren möchte

Beispiel:

dom.Select("div > span")
    .Eq(1)
    .Text("Change the text content of the 2nd span child of each div");

2

Natürlich gibt es Bibliotheken wie das HTML Agility Pack, die Sie bei diesen Bemühungen unterstützen können.

Wenn Sie wirklich keine vorhandene Bibliothek verwenden möchten und einfachen, heruntergekommenen Code möchten, mag ich die Idee, einige der Verhaltensweisen wie in einer vorherigen Antwort zu abstrahieren. Ich mag auch die Idee, einen zugrunde liegenden StringBuilder zu verwenden, im Gegensatz zu einem String aus ein paar Gründen:

  1. Strings sind weniger effizient als der String Builder
  2. StringBuilder ist eine indizierbare Datenstruktur,

Wenn ich keine massiv entwickelte HTML-Engine benötige, würde ich eine einfache, intuitive Benutzeroberfläche erstellen

AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();

1
Die Wendedatenstruktur ist überzeugend, aber ich würde keine Sorgen zu viel über Effizienz: codinghorror.com/blog/2009/01/...
Jim G.

1
Ich habe mich ein paar Mal mit der Schwere von Streichern beschäftigt, besonders mit WIRKLICH großen Streichern. StringBuilder sind speichereffizienter und prozessoreffizienter, wenn sie groß werden. In einer solchen Implementierung, in der der HTML-Code sehr groß werden kann, würde ich mit einem StringBuilder beginnen. Wenn es eine Garantie dafür gäbe, dass der HTML-Code nicht sehr groß wird, wäre ein String sicherlich ausreichend.
Tim C

1
Nun, wenn der HTML-Code wirklich groß werden kann, würde ich das HTML-Agility-Pack auf jeden Fall empfehlen. [Ich habe das HTML Agility Pack tatsächlich zwei Minuten vor Ihnen empfohlen. :)]
Jim G.

1

Wenn Sie nur Zeichenfolgen verwenden, vergessen Sie nicht, alle für HTML reservierten Zeichen in Ihren Ausgabedaten zu maskieren.

&    &
>    >
<    &lt;
"    &quot;
'    &apos;

Ich empfehle jedoch, eine HTML-fähige Klasse oder Bibliothek zu verwenden, anstatt direkt mit Strings zu arbeiten. HTMLWriter sieht nach einem ziemlich guten Start aus.


Vielen Dank für diesen Einblick. Für wen auch immer dies lesen mag, das ist es, was ich benutze, um die Werte einer Datentabelle in einer Artikelvorlage zu übergeben. Der Schlüssel ist (wie Mike Clark vorschlägt) HTML-fähig: <asp: Button ID = "btnEdit" CssClass = "btnmaatwerksmall" runat = "server" Text = "Wijzig" OnClientClick = '<% # String.Format ("OpenChildInEnterprise ({0}, {1}, {2}); ", Eval (" Cursus "), Eval (" Omschrijving "), Eval (" Opmerking "))% > '/>
real_yggdrasil

-1

Fast zwei Jahre nach dem ursprünglichen Post - hier ist eine Lösung, die für mich gut funktioniert hat. Im Zieldokument platziere ich Folgendes:

<table>    
    <%:theHtmlTableMomToldYouAbout() %>    //# Where I want my rows of table data to go
</table>

Die aufgerufene Funktion sieht folgendermaßen aus:

    public HtmlString theHtmlTableMomToldYouAbout()
    {
        string content = "";
        HtmlString theEnvelopePlease = null;

        for (int i = 0; i < 5; i++)
        {
            content = content + "<tr><td>The Number Is: " + i + "</td></tr>";
        }
        theEnvelopePlease = new HtmlString(content);
        return theEnvelopePlease;      
    }

Und die resultierende Ausgabe im Browser ist wie erwartet:
Die Nummer lautet: 0
Die Nummer lautet: 1
Die Nummer lautet: 2
Die Nummer lautet: 3
Die Nummer lautet: 4

Wenn ich zum Quelltext gehe, finde ich Folgendes:

<table>
    <tr><td>The Number Is: 0</td></tr>
    <tr><td>The Number Is: 1</td></tr>
    <tr><td>The Number Is: 2</td></tr>
    <tr><td>The Number Is: 3</td></tr>
    <tr><td>The Number Is: 4</td></tr>
</table>

1
Ich werde darauf hinweisen, dass Ihre Lösung viele der gleichen Probleme aufweist, bei denen "Inhalt" eine unveränderliche Zeichenfolge ist, wie sie in den Beiträgen mit niedriger Punktzahl zu dieser Frage beschrieben wird.

-1

FLAMME AN!

var html = "";
html += "<table class='colorful'>";
foreach(var item in collection) {
     html += "<tr>";
     html += "<td class='boldCell'>" + item.PropWhatever + "</td>";
     // more cells here as needed
     html += "</tr>";
}
html += "</table>";
placeholder1.InnerHtml = html;

Ich werde wahrscheinlich dafür abgelehnt werden, aber als ehemaliger Designer, der HTML im Code optimieren musste, bevor ich wirklich viel über .NET wusste, war der obige Code viel einfacher zu verstehen als die Methoden, die HTML-Erstellung abstrahieren. Wenn Sie der Meinung sind, dass ein Designer jemals an Ihrem HTML-Code arbeiten muss, verwenden Sie einfache Zeichenfolgen wie diese.

Etwas, was viele Entwickler vermissen, wenn sie HTML in Code schreiben, ist, dass in HTML einfache oder doppelte Anführungszeichen für Attribute zulässig sind. Anstatt also alle Anführungszeichen im Code zu maskieren (was für den Nichtinitiierten verdammt witzig aussieht), verwenden Sie einfach einfache Anführungszeichen für die HTML-Anführungszeichen in Ihren Zeichenfolgen.


FEIN. Alles, was Sie Hasser verketten, verkrampft meinen Repräsentanten. Hier ist die 'richtige' Möglichkeit, dies ohne Verkettung von Zeichenfolgen zu tun, aber ich stehe zu meiner Meinung, dass jede normale Seite mit normalen Tabellen außerhalb einer lächerlichen Google-Skala keine Leistungsprobleme aufwirft:

var sb = new System.Text.StringBuilder();
sb.Append("<table class='colorful'>");
foreach (var item in collection)
{
     sb.Append("<tr>");
     sb.Append("<td class='boldCell'>" + item.PropWhatever + "</td>");
     // more cells here as needed
     sb.Append("</tr>");
}
sb.Append("</table>");
placeholder1.InnerHtml = sb.ToString();

3
-1 Verwenden von + zum Verketten von Zeichenfolgen in Schleifen ist das Schlimmste, was Sie tun können.
Daniel Little


Nun, für den Anfang ist die Verwendung +=einer Schleife auf diese Weise überhaupt nicht skalierbar. Da Zeichenfolgen unveränderlich sind, erstellen Sie jedes Mal eine neue Zeichenfolge. Verwenden Sie StringBuilderstattdessen a.
Robert Harvey

3
Warum müssen Menschen, die schrecklichen Code schreiben, ihren schrecklichen Code mit anderen Menschen teilen?
Ramhound

3
@Ramhound Was If you think a designer might ever have to tweak your HTML, use simple strings like this.ist schwer zu verstehen? Die Definition von schrecklichem Code durch manche Leute ist diejenige, die Millisekunden an Leistung einkauft, wobei es viele Sekunden dauert, bis sie vollständig verstanden sind. Wenn Sie davon ausgehen, dass Ihr Code vom kleinsten gemeinsamen Nenner einer Person angezeigt oder verwaltet wird, kann mit Sicherheit davon ausgegangen werden, dass das Schreiben von Code, der einfacher zu verstehen oder zu optimieren ist, immer besser ist als der sauberste oder leistungsstärkste Code.
maple_shaft
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.