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

11

Credo che il markup debba rimanere nel mark-up e non nel codice sottostante.

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

Quando è accettabile creare codice html nel codice? Qual è il miglior metodo per creare questo html? (esempio: stringhe, StringBuilder, HTMLWriter, ecc.)

    
posta Rodney 17.10.2012 - 19:36
fonte

7 risposte

11

Sta usando qualcosa come Rasoio non applicabile qui? Perché se stai facendo un sacco di generazione in html usando un motore di visualizzazione puoi renderlo molto più semplice. È stato anche creato per essere utilizzato al di fuori di ASP.NET.

Tuttavia a volte non è quello che ti serve. Hai preso in considerazione l'utilizzo di TagBuilder classe che fa parte di .net (mvc)? C'è anche il HtmlWriter in System.Web.UI (per il web le forme). Ti consiglierei uno di questi se stai facendo Controls o Html Helpers .

    
risposta data 18.10.2012 - 01:30
fonte
14

Vorrei utilizzare il Html Agility Pack per assemblare HTML e quindi scriverlo su un file di testo.

Sono trascorse molte ore lavorative per rendere l'Html Agility Pack solido e compatibile con HTML HTML-friendly.

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

Dalla pagina iniziale:

Sample applications:

Page fixing or generation. You can fix a page the way you want, modify the DOM, add nodes, copy nodes, well... you name it.

    
risposta data 17.10.2012 - 20:01
fonte
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");
    
risposta data 18.10.2012 - 07:53
fonte
2

Ci sono, naturalmente, librerie là fuori, come HTML Agility Pack che può aiutarti in questi tentativi.

Se davvero non vuoi usare una libreria esistente e vuoi un codice semplice, sporco, mi piace l'idea di astrarre alcuni comportamenti come 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 ho bisogno di un motore HTML progettato in modo massivo, creerei un'interfaccia semplice e intuitiva

AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();
    
risposta data 17.10.2012 - 20:03
fonte
1

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

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

Ti consiglio comunque di utilizzare una classe o una libreria in grado di riconoscere HTML invece di lavorare direttamente con le stringhe. HTMLWriter sembra un buon inizio.

    
risposta data 17.10.2012 - 19:44
fonte
-3

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 a questa:

    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 vedere 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>
    
risposta data 09.10.2014 - 01:29
fonte
-3

FLAME ON!

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 otterrò downvoted per questo, ma come un ex progettista che ha dovuto modificare l'HTML in codice prima di conoscere davvero molto di .NET, il codice di cui sopra era molto più facile da capire rispetto ai metodi che creano una creazione HTML astratta. Se pensi che un designer possa mai dover modificare il tuo codice HTML, usa stringhe semplici come questa.

Qualcosa che vedo mancare molto agli sviluppatori quando scrivono HTML nel codice è che in HTML, le virgolette singole o doppie sono consentite per gli attributi. Quindi, invece di sfuggire a tutte le virgolette nel codice (che sembra malizioso per i non iniziati), basta usare le virgolette singole per le virgolette html all'interno delle stringhe.

AMMENDA. Tutti gli artificieri che concatenano le stringhe sono crampin 'il mio rappresentante. Ecco il modo "corretto" per farlo senza concatenazione di stringhe, ma sono dell'opinione che qualsiasi pagina normale con tabelle normali non presenterà problemi di rendimento 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();
    
risposta data 17.10.2012 - 20:05
fonte

Leggi altre domande sui tag