【问题标题】:Can you recommend a .net template engine? [closed]你能推荐一个.net模板引擎吗? [关闭]
【发布时间】:2010-09-25 07:14:52
【问题描述】:

我正在寻找一个 .net 模板引擎 - 简单、轻量、稳定且没有太多依赖项的东西。我现在需要的只是创建模板化的纯文本和 html 电子邮件。谁能给我一个好的建议?

如果它有帮助的话——比如 Java 的 FreemarkerVelocity 库。

[更新] 感谢到目前为止的答案 - 非常感谢。当您使用这些库时,我对推荐或战争故事非常感兴趣。似乎是做出决定而不依次尝试的最佳方式。

【问题讨论】:

    标签: asp.net templates viewengine templating-engine


    【解决方案1】:

    这里还有一些:

    关于 NVelocity,它已经被 Castle 家伙分叉了,正在开发中here

    对于电子邮件,我需要的不仅仅是 NVelocity。

    【讨论】:

    • 谢谢你的 mausch。您对 NVelocity 有任何疑问吗?
    • 是的,有一些小问题,比如这个:forum.castleproject.org/viewtopic.php?t=4781
    • 所有链接都已失效...
    • @Asken 实际上只有一个,恕我直言,对于一个 7 岁的答案来说,这是相当不错的。
    • 维护也很重要。已经有回程机了:)
    【解决方案2】:

    RazorEngine,基于 Microsoft 的 Razor 解析引擎构建的模板引擎。

    https://github.com/Antaris/RazorEngine

    没用过,但我觉得很有趣,因为如果你有 ASP.NET MVC 背景,你不需要学习新东西。

    【讨论】:

    • 这是一些依赖关系,由于使用旧版本的 system.web.razor 和 razorEngine 需要更新,所以我遇到了很多麻烦,所以在本地我没有因为 GAC 程序集而遇到麻烦,但是在远程服务器 :( 最后我更喜欢使用另一个模板引擎,而不是浪费时间测试版本冲突等。
    【解决方案3】:

    更完整的列表

    • ASP.Net 内置 WebForm 视图引擎
    • ASP 视图
    • 盲文
    • NHaml(Haml 的.Net 端口)
    • 火花
    • NVelocity
    • StringTemplate.Net

    【讨论】:

      【解决方案4】:

      我会推荐CodeSmith Generator。它是一个基于模板的代码生成器,具有不断更新和活跃的社区。这是 CodeSmith 生成器附带的 list of templates

      【讨论】:

        【解决方案5】:

        string template 来自 anltr.org 人员,C# version too

        【讨论】:

          【解决方案6】:

          下面是一些使用 Handlebars、RazorEngine 和 SharpTAL 的测试:

          namespace ConsoleApplication4
          {
          class Program
          {
              static void Main(string[] args)
              {
          
                  Stopwatch sw = new Stopwatch();
          
                  //RAZOR
                  string razorTemplate = @"@model ConsoleApplication4.Test
                                          <h1>@Model.Title</h1>
                                          @if(Model.Condition1)
                                          {
                                              <span>condition1 is true</span>
                                          }
                                          <div>
                                              @foreach(var movie in Model.Movies)
                                                  {<span>@movie</span>}
                                          </div>";
          
                  //burning
                  Engine.Razor.RunCompile(razorTemplate, "templateKey", typeof(Test), new Test());
                  sw.Start();
                  var result1 = Engine.Razor.RunCompile(razorTemplate, "templateKey", typeof(Test), new Test());
                  sw.Stop();
                  Console.WriteLine("razor : "+sw.Elapsed);
          
          
                  //SHARPTAL
                  string sharpTalTemplate = @"<h1>${Title}</h1>             
                                              <span tal:condition=""Condition1"">condition1 is true</span>                                    
          
                                                   <div tal:repeat='movie Movies'>${movie}</div>";
          
          
                  var test = new Test();
                  var globals = new Dictionary<string, object>
                  {
                      { "Movies", new List<string> {test.Movies[0],test.Movies[1],test.Movies[2] } },
                      { "Condition1", test.Condition1 },
                      { "Title", test.Title },
                  };
          
          
          
                  var tt = new Template(sharpTalTemplate);
                  tt.Render(globals);
                  sw.Restart();
                  var tt2 = new Template(sharpTalTemplate);
                  var result2 = tt2.Render(globals);
                  sw.Stop();
                  Console.WriteLine("sharptal : " + sw.Elapsed);
          
          
          
                  //HANDLEBARS
                  string handleBarsTemplate = @"<h1>{{Title}}</h1>
                                          {{#if Condition1}}                                    
                                              <span>condition1 is true</span>
                                          {{/if}}
                                          <div>
                                              {{#each Movies}}
                                                  <span>{{this}}</span>
                                              {{/each}}                                        
                                          </div>";
                  var tt3 = Handlebars.Compile(handleBarsTemplate);
                  sw.Restart();
                  var result3 = tt3(new Test());
                  sw.Stop();
                  Console.WriteLine("handlebars : " + sw.Elapsed);
          
                  Console.WriteLine("-----------------------------");
                  Console.WriteLine(result1);
                  Console.WriteLine(result2);
                  Console.WriteLine(result3);
          
                  Console.ReadLine();
              }
          }
          
          public class Test
          {
              public bool Condition1 { get; set; }
              public List<string> Movies { get; set; }
              public string Title { get; set; }
          
              public Test()
              {
                  Condition1 = true;
                  Movies = new List<string>() { "Rocky", "The Fifth Element", "Intouchables" };
                  Title = "Hi stackoverflow! Below you can find good movie list! Have a good day.";
              }
          }
          
          
          }
          

          和结果:

          【讨论】:

            【解决方案7】:

            我刚刚发布了一个开源项目。它主要针对电子邮件模板,但如果您愿意,可以单独使用解析器。您可以阅读更多详细信息并从我的博客中获取源代码。

            http://thecodedecanter.wordpress.com/2010/07/19/town-crier-an-open-source-e-mail-templating-engine-for-net/

            【讨论】:

              【解决方案8】:

              我认为 Mustache (http://mustache.github.com/) 也可能符合要求。

              【讨论】:

                【解决方案9】:

                DotLiquid 是非常好的 .NET 模板系统。

                它源自 Ruby 的 Liquid Markup,要求 .NET Framework 3.5 或更高版本。

                【讨论】:

                  【解决方案10】:

                  试试这个:电子邮件模板框架http://www.bitethebullet.co.uk/Email_Template_Framework.aspx

                  它在 ASP.NET 和 WinForms 下运行良好,并且仍在积极开发中。也有很好的文档和易于挖掘的示例。

                  【讨论】:

                  【解决方案11】:

                  XCST (eXtensible C-Sharp Templates)

                  <ul>
                     <c:for-each name='n' in='System.Linq.Enumerable.Range(1, 5)' expand-text='yes'>
                        <li>{n}</li>
                     </c:for-each>
                  </ul>
                  

                  【讨论】:

                    【解决方案12】:

                    你见过 NVelocity,Velocity 的 .NET 端口吗? http://nvelocity.sourceforge.net/

                    【讨论】:

                    【解决方案13】:

                    【讨论】:

                    • 您是否使用过第一个链接中列出的库?
                    【解决方案14】:

                    NVELOCITY,虽然很旧,但在 2003 年最后一次发布,已经足够了。

                    【讨论】:

                      【解决方案15】:

                      SharpTAL - 独立引擎正在积极开发中,没有依赖关系,速度很快

                      【讨论】:

                        猜你喜欢
                        • 2011-12-08
                        • 2011-02-28
                        • 2010-09-07
                        • 2011-02-11
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-09-25
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多