星期五, 11月 25, 2011

簡單的Text Templating

最近在處理範本的問題,Bibby 習慣慣把範本寫成一個一個的text檔,然後再寫一個Parser去解析,最後用自己寫好的 class 處理,今天看到一個蠻不錯的 extention,可以很快速的解處理這個問題,在這裡分享給大家

我們先開啟 console application 再開啟NuGet

clip_image001

下載GazorGenerator

clip_image002

安裝完直接在目錄下會多個 SampleTemplate.cshtml 檔案,這是範本測試檔,我們直接在 Program.cs 加入下列這段code 就可以跑了

            var template = new SampleTemplate()
{
Message = "Bibby",
};
Console.WriteLine(template.TransformText());
Console.ReadLine();

我們可以看到畫面是

clip_image001[4]

這樣程式就寫完了,夠快吧! 不過我們一定會想,為啥會這樣就寫完了,我們看剛剛那個 SampleTemplate.cshtml 還有 SampleTemplate.generated.cs 就大概就明瞭了

SampleTemplate.cshtml

@* Generator: Template *@

@functions {
public string Message { get; set; }
}

Hello @Message!
SampleTemplate.generated.cs

#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.239
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace RazorTemplateTest
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "1.2.0.0")]
public partial class SampleTemplate : RazorGenerator.Templating.RazorTemplateBase
{
#line hidden

#line 3 "..\..\SampleTemplate.cshtml"

public string Message { get; set; }

#line default
#line hidden

public override void Execute()
{


WriteLiteral("\r\n\r\n");


WriteLiteral("\r\n\r\nHello ");



#line 7 "..\..\SampleTemplate.cshtml"
Write(Message);


#line default
#line hidden
WriteLiteral("!\r\n");


}
}
}
#pragma warning restore 1591

SampleTemplate.generated.cs是自動產生出來的,裡面程式都實作完了,所以畫面就會是你想要的結果了,那要怎麼設定才有自動產生的功能呢?我們看一下 SampleTemplate.cshtml 的Properties

clip_image001[6]

就是在 Custom Tool 上面加入RazorGenerator,加入後在 cshtml 有任何改變 generated.cs 就會自動再產生一次,設定很簡單,接下來我們就按圖施工新增一個 MailTemplate.cshtml 來試著完成一個需求

MailTemplate.cshtml

@* Generator : Template TypeVisibility : Internal *@
@functions {
public dynamic Model { get; set; }
}
Hi! @Model.Name

非常感謝您申請 @Model.Domain
以下是 @Model.Name 的登入情報。請妥善保管。
(此郵件由自動送信程序發送。)

郵件地址: @Model.Email
密碼 : @Model.Password
登入URL : http://@Model.Domain

-----------------------------
@Model.Domain, inc. http://@Model.Domain

然後在 MailTemplate.cshtml 的 Properties 加入 RazorGenerator 就行了,最後在 Program.cs 上加入

            var mailTemplate = new MailTemplate()
{
Model = new {
Name="Bibby",
Password="1234",
Domain = "Bibby.be",
Email="admin@bibby.be",
}
};
Console.WriteLine(mailTemplate.TransformText());

結果:

clip_image001[8]

這樣就完成我們當初的需求了,收工!不過這方式是有缺點啦,因為要改 cshtml 的時候 generated.cs 會重新產生,這樣對於沒有 visual studio 或是不是 developer 是有問題的,如果有這種需求那要參考我好朋友 Wade的文章 用Razor語法寫範本-RazorEngine組件介紹 這種方式,這樣就可以用程式動態去處理,試試看吧!有問題再一起討論吧!

參考:
http://razorgenerator.codeplex.com/

http://haacked.com/archive/2011/08/01/text-templating-using-razor-the-easy-way.aspx

沒有留言: