【问题标题】:C# template engine [closed]C# 模板引擎 [关闭]
【发布时间】:2010-12-03 21:17:53
【问题描述】:

我正在寻找一个独立的、易于使用的 C# 代码模板引擎。 我想创建一个带有数据占位符的 HTML 和 XML 文件, 并用我的代码中的数据填充它们。

引擎需要支持循环(复制模板的一部分而不是一个对象)和条件(仅当某些条件为真时才将模板的一部分添加到最终的 HTML/XML)。 有人可以为我推荐一个好的选择,并添加一个或多或少这样的代码示例的链接,以及一些关于如何使用推荐的组件来满足我的需求的文档吗?

我还需要使用循环来复制表格行,甚至是整个表格(在 HTML 版本中)和复杂元素(在 XML 版本中)。

【问题讨论】:

标签: c# template-engine


【解决方案1】:

【讨论】:

  • +1 - StringTemplate 强制将视图和模型完全分离 - 根据您的需要,这可能是一个很大的卖点或贬低者。
【解决方案2】:

T4 呢,Text Template Transformation Toolkit?它应该符合您的要求,并且内置在 Visual Studio 中。

很棒的 T4 资源:

Oleg Sych's blog

T4 Editor

T4 Toolbox

【讨论】:

  • 还有一点需要指出的是,这是一个使用 C# 语法的模板引擎。因此无需学习新的模板语法。
【解决方案3】:

有一篇很好的文章如何使用 RazorView 引擎: How to create a localizable text template engine using RazorEngine

【讨论】:

    【解决方案4】:

    SmartFormat 是一个非常简单的库,可以满足您的所有要求。它专注于编写“自然语言”文本,非常适合从列表生成数据或应用条件逻辑。

    语法与String.Format极为相似,非常简单易学易用。这是文档中的语法示例:

    Smart.Format("{Name}'s friends: {Friends:{Name}|, |, and}", user)
    // Result: "Scott's friends: Michael, Jim, Pam, and Dwight"
    

    该库是开源的并且易于扩展,因此您还可以通过其他功能对其进行增强。

    【讨论】:

      【解决方案5】:

      你看过XSLT吗?您必须从 XML 中的源数据格式开始,可能是通过 xml 序列化您的数据对象。 loopsif statements 可以轻松搞定!

      Kathleen Dollard 有a book on generating code via XSLT

      就个人而言,我是T4 的忠实粉丝(尤其是在生成C# 时),但您可能会发现,由于XML 和HTML 是您的输出类型,XSLT 已经涵盖了您。此外,它非常跨平台。

      【讨论】:

      • XSLT 的问题是 XSLT 1.x 使一些简单的任务痛苦 而 XSLT 2.x 是一个神话(或者,至少在我的堆栈中不可用):(
      【解决方案6】:

      我的类库中内置了一个模板引擎,它的外观和工作方式与旧式 ASP 或 T4 类似。

      您基本上是在 块中编写 C# 代码,因此可以做 C# 可以做的大多数事情,但限制是将整个模板文件编译为单个方法。换句话说,你不能在模板中定义辅助类等,但是对于辅助方法你可以做匿名方法。

      例子:

      <%
          var firstname = "Bob";
          var count = 10;
      
          for (Int32 index = 0; index < count; index++)
          {
      %>
      <%= firstname %> x <%= index+1 %>/<%= count %>
      <%
          }
      %>
      

      这将被编译为另一个应用程序域中的 C# 类,并且可以执行以返回包含生成文本的字符串。

      您还可以将参数传递到模板中,也可以引用类库,这意味着您可以传递自定义数据结构,或者从模板访问数据访问层或业务逻辑代码。

      如果您想查看它,代码可以在我的 Subversion 存储库或网页中的类库中找到:

      对于 subversion 存储库,您需要用户名和密码,两者都是“guest”,不带引号。

      代码在 LVK.Text.Templating 项目/程序集中。

      另外,请告诉我(查看个人资料页面上的电子邮件,或发表评论),我会为您提供更多示例。

      【讨论】:

      • 我不太明白你为什么要重新发明 ASP.NET ...
      • 考虑到我正在使用它在 Visual Studio 中生成代码,除此之外,我认为为此在本地设置完整的 ASP.NET 引擎是不可行的。我认为您会拒绝 StringTemplate,正如其他人所说的那样,您需要为此设置完整的 IIS 配置。
      • @silky ASP.NET 不仅仅是一种模板语言。
      • 我希望你把它放在更持久的东西上,因为我到处都是 404 :) 我个人会推荐 BitBucket。除了提供持续的免费托管之外,它还让其他人更容易使用 Mercurial 进行调整(SVN 的设计原则有点太古老了......)
      • 我正在处理它,用一些持久的东西替换我的引用,但我会找到一个我可以控制的地方,我可以在其中编写脚本上传,否则我将不得不发布我的源的完整快照代码,维护起来将是一场噩梦,但我同意,我需要找到比当前更好的东西。
      【解决方案7】:

      你可能需要这个.NET Template Engine

      模板代码:

      $Book.StaticId$
      
      ID: $bk.BookId$ - Author: $bk.Author.Name$
      
      Length of the author's Name: $bk.Author.Name.Length$
      

      C#代码:

      class Author
         {
             public string Name
             {
                 get
                 {
                     return "John Borders";
                 }
             }
         }
         class Book
         {
             public static string StaticId
             {
                 get
                 {
                     return "AABB";
                 }
             }
             public int BookId
             {
                 get
                 {
                     return 100;
                 }
             }
             public Author Author
             {
                 get
                 {
                     return new Author();
                 }
             }
         }
         public class PropertySample1
         {
             [STAThread]
             static void Main()
             {
                 TemplateEngine dt = new TemplateEngine();
                 dt.LoadFromFile("Template.tpl");
                 Book book = new Book();
                 dt.SetValue("bk", book);
                 dt.UsingNamespace("CSharp,Demo");
                 string output = dt.Run();
                 Console.WriteLine(output);
             }
         }
      

      输出是:

      AABB
      
      ID: 100 - Author: John Borders
      
      12
      

      【讨论】:

      • 我无法想象为什么有人愿意为此付费,而不是仅仅使用 T4 模板。这些在某些方面是否比 T4 模板更好?
      • T4 是编译模板,因此用户不能在没有 .NET 编译器的情况下创建自己的模板。但仍然有许多开源替代品
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多