我曾经在几个场合下需要这样做。最初我使用了基于Rick Strahl博客文章的ASP.Net模板引擎。它能够工作,但总是有一些问题让我很头疼。
后来我转而使用NVelocity模板引擎,并发现这是一种非常简单的创建和维护电子邮件模板的方法。还有许多其他的模板引擎,我猜下一次我可能会认真看看Razor engine。
将值合并到模板的代码:
private string Merge(ManualTypeEnum manualType, Object mergeValues)
{
var body = "";
var templateFile = string.Format("{0}MailTemplate.vm", manualType);
var velocity = new VelocityEngine();
var props = new ExtendedProperties();
props.AddProperty("file.resource.loader.path", Config.EmailTemplatePath);
velocity.Init(props);
var template = velocity.GetTemplate(templateFile);
var context = new VelocityContext();
context.Put("Change", mergeValues);
using (var writer = new StringWriter())
{
template.Merge(context, writer);
body = writer.ToString();
}
return body;
}
要合并的值作为匿名对象传递,可以包括各种类型,包括列表等,例如:
var emailBody = Merge(newDocument.ManualType, new
{
ManualType = newDocument.ManualType.ToString(),
Message = change.Message,
NewTitle = newDocument.Title ?? "",
NewVersion = newDocument.Version ?? "",
Contact = From,
Changes = change.ToList(),
});