使用.NET应用程序中的模板生成HTML

时间:2009-05-22 10:25:28

标签: c# .net html template-engine

我有一个需要生成一些HTML文件的.NET控制台应用程序。我可以在StringBuilder中构建HTML并将内容写入文件,但我认为使用某种带有占位符的模板文件可以更好地处理数据,然后在运行时通过它处理我的数据。

我猜有很多方法可以使用aspx,或T4,或者可以与ASP.NET MVC一起使用的一些替代视图引擎,但我不知道最简单的方法是集成到控制台应用程序中(或者我将如何整合它们。)

我希望最终能够调用以下形式的内容:

 GenerateHtml(htmlPath, template, customDataObject);

7 个答案:

答案 0 :(得分:14)

您可以这样做的一种方法是创建一个XSL文件作为模板,将您的customDataObject序列化为XML,然后执行转换以生成所需的HTML。

更新:虽然我喜欢(并且确实使用)其他人提倡的字符串替换方法,但使用XML / XSL有一定的灵活性。假设您的对象具有一个列表属性,例如带有行项目对象列表的订单对象,您几乎必须将必须呈现订单项的逻辑刻录到您的代码中。

使用XSL,您所做的就是将序列化订单对象XML传递给XSL,让XSL处理它需要生成的任何HTML。这意味着您可以经常编辑XSL或具有变体(订单摘要,详细订单等),而无需为您的应用添加额外的代码,而且还有一些额外的重建/部署麻烦。

但是这一切都取决于你需要渲染的复杂性,对于一些工作,字符串替换更为明显,对于其他人来说XSL就是这样。正如我所说,我们都使用它们。

答案 1 :(得分:7)

以下是一些代码,用于说明完成您尝试执行的操作的相当简单的方法:

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]等。然后传入包含值的匿名对象来替换标记。您还可以使用字典或类似的东西替换值对象。

答案 2 :(得分:4)

结帐docu。来自控制台应用的uses the Spark view engine to render templated HTML。很简单。

答案 3 :(得分:3)

正如马特所提到的,火花很好但是对于一些简单的模板来说可能有些过分,如果你不在MVC中使用它会变得复杂。

我个人在NVelocity上取得了很大的成功,我还发布了一个简单的示例/包装使用它:http://simpable.com/code/simpletemplate/

此外,GraffitiCMS的整个主题系统在NVelocity上运行(尽管我可以使用spark,如果它可用于此任务)。

-Scott

答案 4 :(得分:2)

另一种选择,而不是像Kev建议的那样使用XSLT是使用命名字符串格式。使用Phil Haack的代码like this example

在这里,您可以将模板作为字符串(可能从文件中读取)并使用给定对象对其进行格式化。

现在你可以这样做:

var person = new { FirstName = "rune", LastName = "grimstad" };
string template = "<html><body><h1>Hello {FirstName} {LastName}</h1></body></html>";
string html = NamedFormat(template, person);

答案 5 :(得分:1)

有几种方法,

1-使用视图引擎(Razor,Spark,...) - 如果你使用的是mvc,这很好

2- Using XSLT file and transform the given xml to Htm l

3- Using T4 Text Templates(性能最佳,易于理解)

答案 6 :(得分:1)

有很多 HTML 模板引擎/生成器。

根据您的需要选择任何一个即可。

祝你好运。

  • https://github.com/dotliquid/dotliquidDotLiquid 是流行的 Ruby Liquid 模板语言的 .Net 端口。它是一个单独的项目,旨在保留与原始模板语法相同的模板语法,同时使用 . NET 编码约定(在可能的情况下)
  • https://github.com/StubbleOrg/StubbleStubble 在 .NET 中修剪过的 {{mustache}} 模板是 Mustache 模板系统在 C# 中的实现)
  • https://github.com/scriban/scribanScriban 是一种快速、强大、安全和轻量级的 .NET 脚本语言和引擎,主要是为文本模板开发的,具有解析流动模板的兼容模式)
  • https://github.com/sebastienros/fluidFluid 是一种开源 .NET 模板引擎,它尽可能接近 Liquid 模板语言。它是一种安全的模板语言,对于非- 程序员受众。它还包含一个 ASP.NET Core MVC 视图引擎)
  • https://github.com/jdiamond/NustacheNustache - .NET 的无逻辑模板)
  • https://github.com/Handlebars-Net/Handlebars.NetHandlebars.js 是 Chris Wanstrath 创建的 Mustache 模板语言的扩展。Handlebars.js 和 Mustache 都是保持视图和代码分离的无逻辑模板语言就像我们都知道他们应该那样)