Qual è il modo migliore per creare HTML nel codice C #? [chiuso]


15

Sono convinto che il markup debba rimanere nel markup e non nel codice sottostante.

Sono arrivato a una situazione in cui penso sia accettabile costruire l'HTML nel codice dietro. Mi piacerebbe avere un certo consenso su quali siano o dovrebbero essere le migliori pratiche.

Quando è accettabile creare html nel codice dietro? Qual è il metodo migliore per creare questo HTML? (esempio: Stringhe, StringBuilder, HTMLWriter, ecc.)


prova a utilizzare modelli e segnaposto in cui sputerai questo markup HTML.
Yusubov,

5
Un'altra opzione: produrre XML in base al modello di dati e quindi utilizzare XSLT per trasformare l'XML in HTML.
FrustratedWithFormsDesigner,

Oggi sono appena venuto a conoscenza di C # / XAML per HTML5, sembrano promettenti e potrebbero adattarsi al tuo scenario. cshtml5.com
softveda,

un problema con il percorso XSLT è nella localizzazione. Se hai bisogno di due lingue, hai bisogno di due fogli di stile XSLT e mantenerli paralleli. Questo è l'inferno. Meglio scrivere HTML in un file di testo da C #. usa String.Format e $ ".. {variabile} ..." insieme a WPFLocalization?
Erik,

Risposte:


12

L'uso di qualcosa come Razor non è applicabile qui? Perché se stai facendo molta generazione di html usando un motore di visualizzazione puoi renderlo molto più semplice. È stato inoltre creato per essere utilizzato al di fuori di ASP.NET.

Tuttavia a volte non è quello che ti serve. Hai mai considerato di utilizzare la classe TagBuilder che fa parte di .net (mvc)? C'è anche HtmlWriter in System.Web.UI (per i moduli web). Consiglierei uno di questi se stai facendo Controlso Html Helpers.


3
+1, se hai bisogno di un modello all'interno di un rasoio per app è la strada da percorrere. Dai un'occhiata a razorengine @ nuget.org/packages/RazorEngine se hai bisogno di un'ottima opzione per montare il rasoio all'interno di un'app non-asp.net.
Wyatt Barnett,

1
Ho un requisito simile in cui ho bisogno di generare HTML (un sacco di esso) in una libreria di classi. Voglio usare il rasoio per questo, ma faccio fatica a capire come mantenere i file cshtml in una DLL. Come può raggrupparsi?
Yashvit,

Puoi semplicemente passare qualsiasi stringa stackoverflow.com/questions/3628895/…
Daniel Little

14

Vorrei utilizzare l' Html Agility Pack per assemblare HTML e quindi scriverlo in un file di testo.

Molte ore di lavoro sono andate nel rendere l'Html Agility Pack robusto e compatibile con HTML.

Penso che includa anche un'applicazione di esempio che genera HTML.

Dalla home page:

Esempi di applicazioni:

Correzione o generazione della pagina. È possibile correggere una pagina nel modo desiderato, modificare il DOM, aggiungere nodi, copiare nodi, ebbene ... nominarlo.


5

Vorrei usare htmltags per creare HTML.

Esempio:

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

E poi CSQuery se voglio analizzare HTML

Esempio:

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

2

Esistono, naturalmente, librerie là fuori, come HTML Agility Pack che può aiutarti in questi sforzi.

Se davvero non vuoi usare una libreria esistente e desideri un codice semplice e dettagliato, mi piace l'idea di sottrarre alcuni comportamenti come indicato in una risposta precedente. Mi piace anche l'idea di utilizzare un StringBuilder sottostante, al contrario di una stringa per un paio di motivi:

  1. Le stringhe sono meno efficienti del generatore di stringhe
  2. StringBuilder è una struttura di dati indicizzabile,

Se non avessi bisogno di un motore HTML progettato su vasta scala, creerei un'interfaccia semplice e intuitiva

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

1
La struttura dei dati indicizzabili è avvincente, ma non mi preoccuperei troppo dell'efficienza: codinghorror.com/blog/2009/01/…
Jim G.

1
Mi sono impazzito un po 'di volte sulla pesantezza delle stringhe, in particolare le corde VERAMENTE grandi. StringBuilders è più efficiente in termini di memoria ed efficienza del processore quando diventa grande. Quindi, in un'implementazione come questa, in cui l'HTML può diventare davvero grande, inizierei con StringBuilder. Se ci fosse la garanzia che l'HTML non sarebbe diventato molto grande, una stringa sarebbe sicuramente adeguata.
Tim C

1
Bene, se l'HTML può diventare davvero grande, consiglierei sicuramente l'Agility Pack HTML. [In realtà ho raccomandato HTML Agility Pack due minuti prima di te. :)]
Jim G.

1

Se finisci per usare solo stringhe, non dimenticare di sfuggire a tutti i caratteri riservati HTML nei dati di output.

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

Consiglio comunque di utilizzare una classe o una libreria HTML-compatibile invece di lavorare direttamente con le stringhe. HTMLWriter sembra un buon inizio.


Grazie per questa intuizione. Per chiunque possa leggere, questo è quello che uso per passare i valori di un datatable in un modello di elemento. La chiave è (come suggerisce Mike Clark) essere a conoscenza dell'HTML: <asp: Button ID = "btnEdit" CssClass = "btnmaatwerksmall" runat = "server" Text = "Wijzig" OnClientClick = '<% # String.Format ("OpenChildInEnterprise (& apos; {0} & apos;, & apos; {1} & apos;, & apos; {2} & apos;); ", Eval (" Cursus "), Eval (" Omschrijving "), Eval (" Opmerking "))% > '/>
real_yggdrasil il

-1

Quasi due anni dopo il post originale, ecco una soluzione che ha funzionato bene per me. Nel documento di destinazione inserisco quanto segue:

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

la funzione chiamata è simile al seguente:

    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;      
    }

E l'output risultante nel browser è come previsto:
Il numero è: 0
Il numero è: 1
Il numero è: 2
Il numero è: 3
Il numero è: 4

Quando vado a visualizzare la fonte trovo quanto segue:

<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
Sottolineerò che la tua soluzione presenta molti degli stessi problemi con "contenuto" che è una stringa immutabile di quelli descritti nei post con punteggio basso di questa domanda.

-1

INFIAMMA!

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;

Probabilmente verrò ridimensionato per questo, ma come ex designer che ha dovuto modificare l'HTML nel codice prima di sapere davvero molto su .NET, il codice sopra era molto più facile da capire rispetto ai metodi che astraggono la creazione di HTML. Se pensi che un designer potrebbe mai dover modificare il tuo HTML, usa stringhe semplici come questa.

Qualcosa che vedo perdere molti sviluppatori quando scrivono HTML nel codice è che in HTML sono consentite virgolette singole o doppie per gli attributi. Quindi, invece di sfuggire a tutte le virgolette nel codice (che sembra strano per i non iniziati), usa solo virgolette singole per le virgole html all'interno delle tue stringhe.


FINI. Tutti voi che odiate concatenare le corde stanno facendo crollare il mio rappresentante. Ecco il modo "corretto" per farlo senza concatenazione di stringhe, ma sono convinto che qualsiasi pagina normale con tabelle normali non presenterà alcun problema di prestazioni al di fuori di una ridicola scala simile a Google:

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 usare + per concatenare le stringhe nei loop è la cosa peggiore che puoi fare.
Daniel Little,


Bene, per cominciare, usare +=all'interno di un ciclo in questo modo non si ridimensiona affatto; poiché le stringhe sono immutabili, stai creando una nuova stringa ogni volta che lo fai. Usa StringBuilderinvece un .
Robert Harvey,

3
Perché le persone che scrivono codice orribile devono condividere il loro codice orribile con altre persone.
Ramhound,

3
@Ramhound Che dire di If you think a designer might ever have to tweak your HTML, use simple strings like this.è difficile da capire? La definizione di codice orribile di alcune persone è quella che acquista millisecondi di prestazioni al costo di impiegare molti secondi per comprendere appieno. Chiaramente quando prevedi che il tuo codice venga visualizzato o gestito dal minimo comune denominatore dell'individuo, si può certamente affermare che scrivere codice più facile da capire o modificare è sempre meglio del codice più pulito o con le migliori prestazioni.
maple_shaft
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.