2012-05-09 5 views
20

Angenommen, ich muss E-Mail an den Kunden mit Kundendetails und seine Bestellung Detail senden. Ich habe Template-HTML-Daten in einer HTML-Datei.Kunden-Daten gibt es und ebenso wie Bestelldetails gibt es auch in derselben HTML-Template-Datei. schauen meine html wiewie man E-Mail mit E-Mail-Vorlage senden C#

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

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

</body> 
</html> 

jetzt habe ich alle Probe Schlüsselwort füllen wollen umgeben mit {} mit den tatsächlichen Wert und auch durchlaufen und füllen Aufträge.

i Google-Suche und fand, dass Microsoft eine Klasse Maildefinition von denen genannt bieten wir Post Körper dynamisch generieren können. Ich habe auch einen Beispielcode

wie
MailDefinition md = new MailDefinition(); 
md.From = "[email protected]"; 
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("[email protected]", replacements, body, new System.Web.UI.Control()); 

durch den obigen Code, den wir Pseudo-Wert mit dem tatsächlichen Wert ersetzen, aber ich weiß nicht, wie in Bestellungen Detail durchlaufen und Aufträge Daten füllen.

also, wenn es möglich ist, mit MailDefinition Klasse dann bitte führen Sie mich mit Code, wie kann ich in Schleife durchlaufen und Körper für Aufträge Detail generieren.

+0

Wenn ein 3rd Party Bibliothek ist eine Option, einen Blick auf [dotLiquid] (http://dotliquidmarkup.org/). Sie können auch meine Antwort auf eine ähnliche Frage sehen: http://stackoverflow.com/a/28558160/79485 – Marcel

+0

Wie kann ich *** MailDefinition *** herunterladen? – Kiquenet

+0

MailDefinition ist Teil von .NET im System.Web-Namespace. Sie müssen es nicht herunterladen. –

Antwort

41

Als Alternative zu MailDefinition, werfen Sie einen Blick auf RazorEngine https://github.com/Antaris/RazorEngine.

RazorEngine ist ein vereinfachtes Templat-Framework aufgebaut um Microsofts neues Razor Parsing-Engine, sowohl in ASP.NET MVC3 verwendet und Web-Seiten. RazorEngine bietet einen Wrapper und zusätzliche Dienste , die um die Parsing-Engine herum aufgebaut sind, damit die Parsing-Technologie in anderen Projekttypen verwendet werden kann.

Es lässt Sie Rasierapparat Vorlagen außerhalb von ASP.NET MVC verwenden und dann so etwas schreiben ( nicht getestet):

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); 
+0

danke für Ihre Hilfe, aber ich benutze asp.net webform nicht mvc der Code so, der auch in Windows-Anwendung von C# funktioniert. – Thomas

+0

Wirklich schöne, einfache Lösung! Dies war das beste von den 10 oder so, ich habe es überprüft. Ich habe dies ein wenig erweitert, um tatsächliche csthml-Vorlagendateien zu erstellen. Was toll ist, obwohl sie in einer einfachen Klassenbibliothek von Visual Studio als cshtml gelesen werden und ich volle Razor-Syntax-Unterstützung bekomme! – Tim

+0

Ich mag das. Aber meine Template-Autoren haben sich an KnockOut-Vorlagen gewöhnt. Gibt es eine Knockout serverseitige API für Templating? – Ravi

1

Sie können eine solche "komplizierte" Logik nicht mit den standardmäßigen Ersatzdaten durchführen (die Platzhalterbehandlung ist nur für einfache Variablen wie Namen oder Werte vorgesehen).

Sie müssen die Analyse selbst durchführen. Abhängig von der Komplexität (z. B. Schleifen mit Schleifen) kann dies ein bisschen schwierig werden.

Wenn Sie solche Dinge nicht wollen oder brauchen, ist es trivialer. Z.B. Verwenden Sie den regulären Ausdruck \{foreach (.*?)\}(.*?)\{end\}, um solche Schleifen zu finden, und analysieren Sie dann die Inhalte/übereinstimmenden Gruppen so, wie Sie es benötigen. Sobald dieser Teil fertig ist, können Sie andere Werte ersetzen oder die Standard-Ersatzfunktion verwenden.

Der einzige Nachteil bei diesem Ansatz ist die Tatsache, dass Sie die E-Mail für jeden Empfänger neu erstellen müssen (d. H. Sie können keine E-Mails senden, indem Sie MailDefinition verwenden).

+0

ich verstehe einfach nicht, wie man mit loop umgeht. Du sagtest: "Wenn du solche Dinge nicht willst oder brauchst, ist es trivialer. Benutze zum Beispiel den regulären Ausdruck \ {foreach (. *?) \} (. *?) \ {end \}, um solche Schleifen zu finden, dann parsen Sie die Inhalte/übereinstimmenden Gruppen so, wie Sie es benötigen. Sobald dieser Teil fertig ist, kannst du andere Werte ersetzen oder die Standard-Ersatzfunktion verwenden. "Kannst du mir zeigen, was du mit kleinem Beispielcode machen sollst. Danke – Thomas

+0

Eine kurze Einführung in reguläre Ausdrücke und wie man sie benutzt, um sie zu finden Muster finden Sie hier: http://support.microsoft.com/kb/308252/en-us Wenn der reguläre Ausdruck übereinstimmt, werden Sie wissen, dass es eine Schleife gibt.Die Erfassungsgruppen enthalten das Objekt/die Gruppe, die durchlaufen werden soll als String (in Ihrem Beispiel ', Orders '') sowie als Formatstring für jede Bestellung (' "Order ID {OrderId} ..." '). Wenn Sie mit regulären Ausdrücken nicht vertraut sind, Die Verwendung einer vollständigen/vorgefertigten Lösung (wie die von David vorgeschlagene Lösung) stellt möglicherweise die bessere Lösung dar. Wenn Sie möchten, können Sie später ein kurzes Beispiel schreiben: – Mario