C#模板引擎


71

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

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

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




NETString替代StringTemplate的是github.com/beto-rodriguez/Templator,它简单快捷,您可以通过nuget进行安装Install-Package Tor
bto.rdz 2015年

您可以使用几行代码轻松地从源模板,输入变量和.NET类生成格式化的文本输出。以下TemplateEngine thedownloadplanet.com/reviews/template-engine-component-for-net适用于.NET,Silverlight和.NET Compact Framework。
brunoid

Answers:





10

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

语法与极其相似String.Format,并且非常简单易学和易于使用。这是文档中语法的示例:

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

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


6

您是否看过XSLT?您必须从XML的源数据格式开始,也许是通过对数据对象进行xml序列化。您可以轻松地执行循环if语句

Kathleen Dollard有一本关于通过XSLT生成代码的书

就个人而言,我是T4的忠实拥护者(尤其是在生成C#时),但是您可能会发现,由于XML和HTML是您的输出类型,因此XSLT可以满足您的要求。另外,它是非常跨平台的。


4
XSLT的问题在于XSLT 1.x使一些简单的任务痛苦不堪,而XSLT 2.x只是一个神话(或者,至少在我的堆栈中不可用):(

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项目/程序集中。

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


我不太明白为什么您要重新发明ASP.NET ...
Noon Silk

5
考虑到我正在使用它在Visual Studio中生成代码,除其他外,我认为在本地设置完整的ASP.NET引擎是不可行的。我认为您会讨厌StringTemplate,这是其他人提到的要求,您需要为此设置完整的IIS配置。
Lasse V. Karlsen

@silky ASP.NET不仅仅是一种模板语言。
chakrit

希望您能在更持久的环境中托管它,因为我能找到404 :)我个人建议使用BitBucket。除了提供持久的免费托管服务之外,还可以使其他人更容易通过使用Mercurial来进行调整(SVN的设计原理有点太古老了……)
Roman Starkov 2010年

我正在努力,用持久的内容替换我的引用,但是我会找到一个地方,可以控制在哪里可以编写上载脚本,否则我将不得不释放源代码的完整快照,这将是保持噩梦,但我同意,我需要找到比当前更好的东西。
Lasse V. Karlsen

1

您可能需要此.NET模板引擎

模板代码:

$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

9
我无法想象为什么有人会为此花钱,而不是仅仅使用T4模板。这些在某种程度上比T4模板好吗?
约翰·桑德斯

1
T4是已编译的模板,因此用户无法在没有.NET编译器的情况下创建自己的模板。但仍然有许多开源替代方案
Tomer W
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.