C#模板引擎

时间:2009-10-05 09:05:08

标签: c# template-engine

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

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

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

7 个答案:

答案 0 :(得分:22)

答案 1 :(得分:16)

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

伟大的T4资源:

Oleg Sych's blog

T4 Editor

T4 Toolbox

答案 2 :(得分:16)

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

答案 3 :(得分:10)

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

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

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

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

答案 4 :(得分:6)

你看过XSLT了吗?您必须从XML开始使用源数据格式,可能是通过xmlserializing您的数据对象。您可以轻松完成loopsif statements

Kathleen Dollard有a book on generating code via XSLT

就个人而言,我是T4的忠实粉丝(特别是在生成C#时),但您可能会发现,因为XML和HTML是您的输出类型,所以XSLT已经涵盖了您。而且它非常跨平台。

答案 5 :(得分:2)

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

您基本上在< %%>中编写C#代码块,因此可以完成C#可以做的大部分工作,但是整个模板文件被编译为单个方法的限制。换句话说,你不能在模板中定义辅助类等,但对于辅助方法,你可以使用匿名方法。

示例:

<%
    var firstname = "Bob";
    var count = 10;

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

然后将其编译到另一个appdomain中的C#类,并且可以执行它以返回包含生成文本的字符串。

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

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

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

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

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

答案 6 :(得分:1)

您可能需要.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