我正在尋找一個.net模板引擎 - 一些簡單,輕量,穩定且不需要太多依賴的東西。目前我需要的是創建模板化的純文本和html電子郵件。任何人都可以給我一個好的建議嗎?你能推薦一個.net模板引擎嗎?
如果它有幫助 - 就像Java的Freemarker或Velocity庫。
[更新] 感謝您的答案,迄今爲止 - 非常感謝。當你使用這些庫的時候,我的建議和戰爭故事都是真實的。似乎是最好的方式做出決定,而不是每個輪流嘗試。
我正在尋找一個.net模板引擎 - 一些簡單,輕量,穩定且不需要太多依賴的東西。目前我需要的是創建模板化的純文本和html電子郵件。任何人都可以給我一個好的建議嗎?你能推薦一個.net模板引擎嗎?
如果它有幫助 - 就像Java的Freemarker或Velocity庫。
[更新] 感謝您的答案,迄今爲止 - 非常感謝。當你使用這些庫的時候,我的建議和戰爭故事都是真實的。似乎是最好的方式做出決定,而不是每個輪流嘗試。
你見過Velocity的.NET端口NVelocity嗎? http://nvelocity.sourceforge.net/
http://csharp-source.net/open-source/template-engines
http://joel.net/code/dotnet_templates.aspx
希望這有助於!
你有沒有使用第一個鏈接中列出的任何庫? – serg10 2008-12-04 11:35:08
秒是404錯誤 – 2011-08-25 09:32:52
string template來自anltr.org的人與C# version too。
更完整的列表
我剛剛發佈了一個開源項目。它主要針對電子郵件模板,但如果您願意,您可以單獨使用解析器。您可以閱讀更多的細節,並從我的博客中獲取源代碼。
我會建議CodeSmith Generator。它是一個基於模板的代碼生成器,具有持續更新和活躍的社區。這是CodeSmith Generator附帶的list of templates。
試試這個:電子郵件模板框架http://www.bitethebullet.co.uk/Email_Template_Framework.aspx
它ASP.NET和WinForms下的偉大工程,目前仍在積極發展。這裏也有非常好的文檔,很容易在示例中挖掘。
我認爲Mustache(http://mustache.github.com/)也可能符合法案。
NVELOCITY儘管很舊,但在2003年的最後一次發佈,足夠了。
RazorEngine,一個建立在微軟Razor解析引擎上的模板引擎。
https://github.com/Antaris/RazorEngine
還沒有使用它,但我覺得很有意思,因爲如果你有一個ASP.NET MVC的背景,你會不會需要學習新的東西。
SharpTAL - 獨立引擎在積極發展,沒有依賴關係,快速
DotLiquid是.NET非常漂亮的模板系統。
它來源於Ruby的Liquid Markup,需求.NET Framework 3.5或更高版本。
與車把,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.";
}
}
}
和結果:
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>
感謝您的mausch。你有沒有與NVelocity有關的問題? – serg10 2008-12-04 11:36:05