50 votes

Écrire du HTML dans une chaîne de caractères

J'ai un code comme celui-ci. Existe-t-il un moyen de le rendre plus facile à écrire et à maintenir ? J'utilise C# .NET 3.5.

string header(string title)
{
    StringWriter s = new StringWriter();
    s.WriteLine("{0}","<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">");
    s.WriteLine("{0}", "<html>");
    s.WriteLine("<title>{0}</title>", title);
    s.WriteLine("{0}","<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">");
    s.WriteLine("{0}", "</head>");
    s.WriteLine("{0}", "<body>");
    s.WriteLine("{0}", "");
}

Je pourrais aussi simplement écrire :

s.WriteLine("{0}", @"blah blah

many
new
lines
blah UHY#$&_#$_*@Y KSDSD<>\t\t\t\t\t\tt\t\t\\\t\t\t\t\\\h\th'\h't\th
hi
done"); 

Ça va fonctionner, mais je dois remplacer toutes les " avec "" .

16 votes

C'est bien que tu comprennes que c'est une mauvaise façon de créer un fichier html en utilisant un programme.

0 votes

Pourquoi utiliser le {0} du tout ? Sauf pour le titre, vous n'en avez pas besoin. Vous pouvez simplement mettre votre chaîne de caractères comme premier argument et ne pas utiliser de second argument.

91voto

lc. Points 50297

Il est probablement préférable d'utiliser un HtmlTextWriter ou un XMLWriter qu'un simple StringWriter . Ils s'occuperont de l'échappement pour vous, et s'assureront que le document est bien formé.

Cette page montre les bases de l'utilisation du HtmlTextWriter dont l'essentiel est :

StringWriter stringWriter = new StringWriter();

using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
{
    writer.AddAttribute(HtmlTextWriterAttribute.Class, classValue);
    writer.RenderBeginTag(HtmlTextWriterTag.Div); // Begin #1

    writer.AddAttribute(HtmlTextWriterAttribute.Href, urlValue);
    writer.RenderBeginTag(HtmlTextWriterTag.A); // Begin #2

    writer.AddAttribute(HtmlTextWriterAttribute.Src, imageValue);
    writer.AddAttribute(HtmlTextWriterAttribute.Width, "60");
    writer.AddAttribute(HtmlTextWriterAttribute.Height, "60");
    writer.AddAttribute(HtmlTextWriterAttribute.Alt, "");

    writer.RenderBeginTag(HtmlTextWriterTag.Img); // Begin #3
    writer.RenderEndTag(); // End #3

    writer.Write(word);

    writer.RenderEndTag(); // End #2
    writer.RenderEndTag(); // End #1
}
// Return the result.
return stringWriter.ToString();

0 votes

Système de référence.Web

25voto

SpliFF Points 21945

Lorsque je traite ce problème dans d'autres langues, j'opte pour une séparation du code et du HTML. Quelque chose comme :

1.) Créez un modèle HTML. utilisez [varname] des espaces réservés pour marquer le contenu remplacé/inséré.
2.) Remplissez les variables de votre modèle à partir d'un tableau ou d'une structure/mapping/dictionnaire.

Write( FillTemplate(myHTMLTemplate, myVariables) ) # pseudo-code

0 votes

Puis-je obtenir un lien vers un exemple de création d'un modèle HTML ? dans n'importe quel langage ? (je peux m'accommoder d'un langage autre que C# s'il s'agit de .NET).

0 votes

Il existe des moteurs de modèles qui peuvent vous faciliter la tâche. Voir wikipedia pour une liste : fr.wikipedia.org/wiki/Template_engine_(web)

0 votes

La classe Parser est simple et facile à utiliser : codeproject.com/KB/dotnet/mailtemplates.aspx

14voto

Jim Wallace Points 738

Je sais que votre question portait sur C#, mais si vous êtes prêt à utiliser n'importe quel langage .Net, je vous recommande vivement Visual Basic pour ce problème précis. Visual Basic possède une fonctionnalité appelée XML Literals qui vous permettra d'écrire un code comme celui-ci.

Module Module1

    Sub Main()

        Dim myTitle = "Hello HTML"
        Dim myHTML = <html>
                         <head>
                             <title><%= myTitle %></title>
                         </head>
                         <body>
                             <h1>Welcome</h1>
                             <table>
                                 <tr><th>ID</th><th>Name</th></tr>
                                 <tr><td>1</td><td>CouldBeAVariable</td></tr>
                             </table>
                         </body>
                     </html>

        Console.WriteLine(myHTML)
    End Sub

End Module

Cela vous permet d'écrire directement du HTML avec des trous d'expression dans le vieux style ASP et rend votre code super lisible. Malheureusement, cette fonctionnalité n'est pas disponible en C#, mais vous pouvez écrire un module unique en VB et l'ajouter comme référence à votre projet C#.

L'écriture dans Visual Studio permet également une indentation correcte pour la plupart des littéraux XML et des expressions entières. L'indentation pour les trous d'expression est meilleure dans VS2010.

1 votes

J'ai complètement oublié ça. Bien vu.

1 votes

C'est une fonctionnalité vraiment géniale de VB. J'ai créé un gist qui convertit n'importe quelle DataTable en une balise de table HTML de manière générique : gist.github.com/sergkr/13d57dca75b385f0a359

0 votes

J'aimerais que cela soit possible en C# :(

7voto

Jimmy Points 35501
return string.Format(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN""      ""http://www.w3.org/TR/html4/strict.dtd"">
<html>
<title>{0}</title>
<link rel=""stylesheet"" type=""text/css"" href=""style.css"">
</head>
<body>
", title);

2 votes

En fonction de l'origine du titre, vous voudrez probablement coder le titre au format HTML avant de l'insérer aveuglément dans une chaîne.

0 votes

À l'époque où j'utilisais une méthode aussi maladroite, je séparais chaque ligne en ajoutant un signe Environment.NewLine entre les lignes html où je voulais garder les coupures.

7voto

Josh Points 38617

Vous pourriez utiliser System.Xml.Linq objets. Ils ont été totalement redessinés à partir de l'ancien System.Xml jours, ce qui rendait la construction de XML à partir de zéro vraiment ennuyeuse.

En dehors du doctype je suppose, vous pourriez facilement faire quelque chose comme :

var html = new XElement("html",
    new XElement("head",
        new XElement("title", "My Page")
    ),
    new XElement("body",
        "this is some text"
    )
);

1 votes

C'est génial, vous pouvez aussi utiliser new XElement("div", new XAttribute("class", "container")) pour créer des attributs, pour ceux qui se posent la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X