27

假设我需要向客户发送包含客户详细信息和订单详细信息的邮件。我在 html 文件中有模板 html 数据。客户数据在那里,订单详细信息也在同一个 html 模板文件中。我的 html 看起来像

<html>
<body>
Hi {FirstName} {LastName},

Here are your orders: 
{foreach Orders}
    Order ID {OrderID} Quantity : {Qty} <strong>{Price}</strong>. 
{end}

</body>
</html>

现在我想用实际值填写所有用 {} 包围的示例关键字,并迭代和填写订单。

我搜索谷歌,发现微软提供了一个名为MailDefinition的类 ,我们可以通过它动态生成邮件正文。我也有一个示例代码

MailDefinition md = new MailDefinition();
md.From = "test@domain.com";
md.IsBodyHtml = true;
md.Subject = "Test of MailDefinition";

ListDictionary replacements = new ListDictionary();
replacements.Add("<%Name%>", "Martin");
replacements.Add("<%Country%>", "Denmark");

string body = "
Hello <%Name%> You're from <%Country%>.";


MailMessage msg = md.CreateMailMessage("you@anywhere.com", replacements, body, new    System.Web.UI.Control());

通过上面的代码,我们可以用实际值替换伪值,但我不知道如何迭代订单详细信息并填充订单数据。

因此,如果可以使用 MailDefinition 类,那么请用代码指导我如何在循环中迭代并为订单详细信息生成正文。

4

2 回答 2

48

作为 MailDefinition 的替代方案,请查看 RazorEngine https://github.com/Antaris/RazorEngine

RazorEngine 是围绕 Microsoft 的新 Razor 解析引擎构建的简化模板框架,用于 ASP.NET MVC3 和网页。RazorEngine 提供围绕解析引擎构建的包装器和附加服务,以允许在其他项目类型中使用解析技术

它允许您在 ASP.NET MVC 之外使用 razor 模板,然后编写类似这样的内容(未经测试):

string template =
@"<html>
<body>
Hi @Model.FirstName @Model.LastName,

Here are your orders: 
@foreach(var order in Model.Orders) {
    Order ID @order.Id Quantity : @order.Qty <strong>@order.Price</strong>. 
}

</body>
</html>";

var model = new OrderModel {
    FirstName = "Martin",
    LastName = "Whatever",
    Orders = new [] {
        new Order { Id = 1, Qty = 5, Price = 29.99 },
        new Order { Id = 2, Qty = 1, Price = 9.99 }
    }
};

string mailBody = Razor.Parse(template, model);
于 2012-05-09T09:12:46.563 回答
1

您不能使用默认替换内容来执行这种“复杂”的逻辑(占位符处理仅用于简单变量,例如名称或值)。

您必须自己进行解析。根据复杂性(例如带有循环的循环),这可能会有些棘手。

如果您不想要或不需要这些东西,那就更微不足道了。例如,使用正则表达式\{foreach (.*?)\}(.*?)\{end\}查找此类循环,然后按照您需要的方式解析内容/匹配的组。完成该部分后,您可以替换其他值或使用默认替换功能。

这种方法的唯一缺点是您必须为每个收件人重新创建邮件(即,您不能使用 群发邮件MailDefinition)。

于 2012-05-09T09:07:49.757 回答