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>

ここで、{} で囲まれたすべてのサンプル キーワードに実際の値を入力し、反復して注文を入力したいと考えています。

Google で検索したところ、Microsoft がメール本文を動的に生成できる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の代わりに、RazorEnginehttps ://github.com/Antaris/RazorEngineをご覧ください

RazorEngineは、ASP.NET MVC3とWebページの両方で使用される、Microsoftの新しいRazor解析エンジンを中心に構築された単純化されたテンプレートフレームワークです。RazorEngineは、解析テクノロジを他のプロジェクトタイプで使用できるようにするために、解析エンジンを中心に構築されたラッパーと追加のサービスを提供します

ASP.NET MVCの外部でかみそりのテンプレートを使用して、次のように記述できます(テストされていません)。

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 に答える