Генерация HTML с использованием шаблона из приложения .NET.
-
23-08-2019 - |
Вопрос
У меня есть консольное приложение .NET, которому необходимо создать несколько файлов HTML.Я мог бы просто создать HTML в StringBuilder и записать содержимое в файл, но я подумал, что было бы лучше использовать какой-нибудь файл шаблона с заполнителями для размещения данных, а затем обрабатывать через него данные во время выполнения.
Я предполагаю, что есть способы использовать aspx, или T4, или некоторые альтернативные механизмы представления, которые вы можете использовать с ASP.NET MVC, но я не знаю, что было бы проще всего интегрировать в консольное приложение (или как Я бы их интегрировал).
Я хочу в конечном итоге иметь возможность вызывать что-то в форме:
GenerateHtml(htmlPath, template, customDataObject);
Решение
Как упомянул Мэтт, Spark — это хорошо, но для некоторых простых шаблонов он может оказаться излишним и усложниться, если вы не используете его в MVC.
Лично я добился большого успеха с NVelocity, и я также публикую простой пример/оболочку по его использованию: http://simpable.com/code/simpletemplate/
Кроме того, вся система тем GraffitiCMS работает на NVelocity (хотя я бы использовал Spark, если бы он был доступен для этой задачи).
-Скотт
Другие советы
Один из способов сделать это — создать файл XSL в качестве шаблона, сериализовать ваш customDataObject
как XML, затем выполните преобразование для создания требуемого HTML.
Обновлять: Хотя мне нравится (и я использую) метод замены строк, предложенный здесь другими людьми, в использовании XML/XSL есть определенная гибкость.Допустим, у вашего объекта есть свойство, представляющее собой список, например объект заказа со списком объектов отдельных позиций, вам в значительной степени придется встроить в свой код логику, которая должна отображать отдельные позиции.
При использовании XSL все, что вам нужно сделать, это передать XML-код сериализованного объекта заказа в XSL и позволить XSL обрабатывать любой HTML, который ему необходимо сгенерировать.Это означает, что вы часто можете редактировать XSL на месте или иметь варианты (сводка заказа, подробный заказ и т. д.), не добавляя дополнительный код в свое приложение со всеми дополнительными хлопотами по пересборке/развертыванию.
Но тут все зависит от сложности того, что вам нужно визуализировать, для некоторых задач замена строки более очевидна, для других подойдет XSL.Как я уже сказал, мы используем оба.
Вот код, иллюстрирующий довольно простой способ выполнить то, что вы пытаетесь сделать:
using System;
using System.IO;
public class HtmlTemplate
{
private string _html;
public HtmlTemplate(string templatePath)
{
using (var reader = new StreamReader(templatePath))
_html = reader.ReadToEnd();
}
public string Render(object values)
{
string output = _html;
foreach (var p in values.GetType().GetProperties())
output = output.Replace("[" + p.Name + "]", (p.GetValue(values, null) as string) ?? string.Empty);
return output;
}
}
public class Program
{
void Main()
{
var template = new HtmlTemplate(@"C:\MyTemplate.txt");
var output = template.Render(new {
TITLE = "My Web Page",
METAKEYWORDS = "Keyword1, Keyword2, Keyword3",
BODY = "Body content goes here",
ETC = "etc"
});
Console.WriteLine(output);
}
}
Используя это, все, что вам нужно сделать, это создать несколько шаблонов HTML и заполнить их заменяемыми токенами, такими как [TITLE], [METAKEYWORDS] и т. д.Затем передайте анонимные объекты, содержащие значения для замены токенов.Вы также можете заменить объект значения словарем или чем-то подобным.
Проверить документ.Это использует механизм представления Spark для рендеринга шаблонного HTML из консольного приложения.Довольно просто.
Другой вариант вместо использования XSLT, как предлагает Кев, — использовать форматирование именованных строк.Использование кода как этот пример Фил Хаак.
Здесь вы можете сохранить свой шаблон в виде строки (возможно, прочитать из файла) и отформатировать его, используя данный объект.
Теперь вы можете сделать что-то вроде этого:
var person = new { FirstName = "rune", LastName = "grimstad" };
string template = "<html><body><h1>Hello {FirstName} {LastName}</h1></body></html>";
string html = NamedFormat(template, person);
Есть несколько способов,
1- Использование механизма просмотра (Razor, Spark,...) – это хорошо, если вы используете MVC.
2- Использование файла XSLT и преобразование данного XML в Htmл
3- Использование текстовых шаблонов T4 (Лучшая производительность, легко понять)