Запишите HTML для строкового представления

У меня есть код как это. Существует ли способ помочь записать и поддержать? Используя.NET C# 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}", "");
}

Я мог также просто записать:

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"); 

Это будет работать, но я должен заменить все " с "".

45
задан Erik Humphrey 23 September 2019 в 16:15
поделиться

11 ответов

Вам, вероятно, лучше использовать HtmlTextWriter или XMLWriter , чем простой StringWriter . Они позаботятся об экранировании за вас, а также о том, чтобы документ был правильно сформирован.

На этой странице показаны основы использования класса HtmlTextWriter , суть которого:

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();
88
ответ дан 26 November 2019 в 20:48
поделиться

Это действительно зависит от ваших целей и, в частности, от того, какую производительность вам действительно нужно предложить.

Я видел замечательные решения для разработки строго типизированного HTML (полный контроль модели, будь то веб-элементы управления ASP.NET или аналогичные им), которые просто добавляют невероятную сложность проекту. В других ситуациях это идеально.

В порядке предпочтения в мире C #,

  • Веб-элементы управления ASP.NET
  • Примитивы ASP.NET и элементы управления HTML
  • XmlWriter и / или HtmlWriter
  • Если при разработке Silverlight с возможностью взаимодействия с HTML рассмотрите что-нибудь строго типизированное, например текст ссылки
  • StringBuilder и другие суперпримитивы
0
ответ дан 26 November 2019 в 20:48
поделиться

Вы можете написать свои собственные классы с его методом Render и другими атрибутами, чтобы избежать большого беспорядка, если вы будете его часто использовать, а затем также использовать HTMLWriter или xmlwriter. Эта логика используется на страницах asp.net, вы можете унаследовать от webControl и переопределить метод рендеринга , что отлично подходит, если вы разрабатываете элементы управления на стороне сервера.
Это может быть хороший пример.

С уважением

0
ответ дан 26 November 2019 в 20:48
поделиться

Вы можете использовать ASP.NET для генерации вашего HTML вне контекста веб-страниц. Вот статья , в которой показано, как это можно сделать.

2
ответ дан 26 November 2019 в 20:48
поделиться

Самый простой способ - использовать объект XmlWriter. Это можно использовать для создания действительного HTML и позаботится обо всех неприятных escape-последовательностях за вас.

5
ответ дан 26 November 2019 в 20:48
поделиться

Это не универсальное решение, однако, если ваша цель - иметь или поддерживать шаблоны электронной почты, то System.Web имеет встроенный класс MailDefinition . Этот класс используется элементами управления членством ASP.NET для создания электронных писем в формате HTML.

Выполняет тот же тип «замены строк», как упомянуто выше, но упаковывает все это в MailMessage для вас.

Вот пример из MSDN:

ListDictionary replacements = new ListDictionary();
replacements.Add("<%To%>",sourceTo.Text);
replacements.Add("<%From%>", md.From);
System.Net.Mail.MailMessage fileMsg;
fileMsg = md.CreateMailMessage(toAddresses, replacements, emailTemplate, this); 
return fileMsg;
1
ответ дан 26 November 2019 в 20:48
поделиться
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);
6
ответ дан 26 November 2019 в 20:48
поделиться

Вы можете использовать объекты System.Xml.Linq . Они были полностью переработаны по сравнению со старыми System.Xml днями, которые делали создание XML с нуля по-настоящему утомительным.

Я думаю, кроме документа, вы могли бы легко сделать что-то вроде:

var html = new XElement("html",
    new XElement("head",
        new XElement("title", "My Page")
    ),
    new XElement("body",
        "this is some text"
    )
);
6
ответ дан 26 November 2019 в 20:48
поделиться

Я знаю, что вы спрашивали о C #, но если вы Если вы хотите использовать любой язык .Net, то я настоятельно рекомендую Visual Basic для решения именно этой проблемы. Visual Basic имеет функцию под названием XML Literals, которая позволит вам писать подобный код.

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

Это позволяет вам писать простой HTML с дырами в выражениях в старом стиле ASP и делает ваш код очень удобочитаемым. К сожалению, этой функции нет в C #, но вы можете написать отдельный модуль в VB и добавить его в качестве ссылки на свой проект C #.

Написание в Visual Studio также допускает правильные отступы для большинства XML-литералов и целых выражений. Отступ для дырок выражений лучше в VS2010.

14
ответ дан 26 November 2019 в 20:48
поделиться

Когда я решаю эту проблему на других языках, я иду на разделение кода и HTML. Что-то вроде:

1.) Создайте шаблон HTML. используйте заполнители [varname] для отметки замененного / вставленного содержимого.
2.) Заполните переменные шаблона из массива или структуры / отображения / словаря

Write( FillTemplate(myHTMLTemplate, myVariables) ) # pseudo-code
24
ответ дан 26 November 2019 в 20:48
поделиться

Если вы хотите создать документ HTML, аналогичный тому, как вы создаете документ XML на C #, вы можете попробовать библиотеку с открытым исходным кодом Microsoft, Html Agility Pack .

Он предоставляет объект HtmlDocument, API которого очень похож на класс System.Xml.XmlDocument .

3
ответ дан 26 November 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: