2012-05-09 60 views
20

giả sử tôi cần gửi thư cho khách hàng với chi tiết của khách hàng và chi tiết đơn hàng của mình. tôi có dữ liệu mẫu html trong một tệp html. Dữ liệu khách hàng ở đó và cũng như chi tiết đơn đặt hàng cũng có trong cùng một tệp mẫu html. html của tôi trông giống nhưcách gửi mẫu email wth email C#

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

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

</body> 
</html> 

bây giờ tôi muốn điền vào tất cả từ khóa mẫu được bao quanh với {} với giá trị thực tế và cũng lặp lại và điền vào đơn đặt hàng.

tôi tìm kiếm trên google và thấy rằng microsoft cung cấp một lớp được gọi là MailDefinition để chúng tôi có thể tạo nội dung thư động. tôi cũng có mã mẫu giống như

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()); 

bởi mã trên chúng ta có thể thay thế giá trị giả với giá trị thực nhưng tôi không biết cách lặp lại chi tiết đơn hàng và điền dữ liệu đơn đặt hàng.

vì vậy nếu có thể sử dụng lớp MailDefinition thì vui lòng hướng dẫn tôi bằng mã rằng làm cách nào tôi có thể lặp trong vòng lặp và tạo thân cho chi tiết đơn đặt hàng.

+0

Nếu một thư viện 3rd Party là một lựa chọn, có một cái nhìn tại [dotLiquid] (http://dotliquidmarkup.org/). Bạn cũng có thể muốn xem câu trả lời của tôi cho một câu hỏi tương tự: http://stackoverflow.com/a/28558160/79485 – Marcel

+0

Tôi làm cách nào để tải xuống *** MailDefinition ***? – Kiquenet

+0

MailDefinition là một phần của .NET, trong không gian tên System.Web. Bạn không cần phải tải xuống. –

Trả lời

41

Để thay thế cho MailDefinition, hãy xem RazorEngine https://github.com/Antaris/RazorEngine.

RazorEngine là một khuôn khổ khuôn mẫu đơn giản xây dựng xung quanh engine Razor phân tích mới của Microsoft, được sử dụng trong cả hai ASP.NET MVC3 và trang Web. RazorEngine cung cấp trình bao bọc và các dịch vụ bổ sung được xây dựng xung quanh công cụ phân tích cú pháp để cho phép công nghệ phân tích cú pháp được sử dụng trong các loại dự án khác.

Nó cho phép bạn sử dụng các mẫu dao cạo bên ngoài của ASP.NET MVC và sau đó viết một cái gì đó như thế này (chưa được thử nghiệm):

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

cảm ơn sự giúp đỡ ur nhưng tôi đang sử dụng asp.net webform không mvc. mã theo cách như vậy sẽ hoạt động trong ứng dụng windows bằng C#. – Thomas

+0

Thực sự tốt đẹp, giải pháp đơn giản! Đây là điều tốt nhất trong số 10 câu hỏi mà tôi đã xem xét. Tôi mở rộng này một chút để tạo các tệp mẫu csthml thực tế. Điều tuyệt vời là mặc dù trong thư viện lớp đơn giản, Visual Studio vẫn chọn chúng như cshtml và tôi nhận được hỗ trợ cú pháp Razor đầy đủ! – Tim

+0

Tôi thích điều này. Nhưng các tác giả khuôn mẫu của tôi đã quen với các mẫu KnockOut. Có bất kỳ API phía máy chủ Knockout nào để tạo khuôn mẫu không? – Ravi

1

Bạn không thể thực hiện logic "phức tạp" này bằng công cụ thay thế mặc định (chỉ xử lý trình giữ chỗ cho các biến đơn giản, ví dụ: tên hoặc giá trị).

Bạn sẽ phải tự phân tích cú pháp. Tùy thuộc vào độ phức tạp (ví dụ: vòng lặp với vòng lặp), điều này có thể hơi phức tạp một chút.

Nếu bạn không muốn hoặc cần những thứ như vậy, điều đó sẽ tầm thường hơn. Ví dụ. sử dụng cụm từ thông dụng \{foreach (.*?)\}(.*?)\{end\} để tìm các vòng lặp đó, sau đó phân tích cú pháp nội dung/nhóm phù hợp theo cách bạn cần. Khi phần đó được thực hiện, bạn có thể thay thế các giá trị khác hoặc sử dụng tính năng thay thế mặc định.

Chỉ có nhược điểm với phương pháp này là bạn sẽ phải tạo lại thư cho mỗi người nhận (nghĩa là bạn không thể gửi thư hàng loạt bằng cách sử dụng MailDefinition).

+0

tôi chỉ không hiểu làm thế nào để xử lý vòng lặp. u nói: "Nếu bạn không muốn hoặc cần những thứ như vậy, nó sẽ tầm thường hơn. Ví dụ: sử dụng cụm từ thông dụng \ {foreach (. *?) \} (. *?) \ {end \} để tìm các vòng lặp đó, sau đó phân tích nội dung/nhóm phù hợp theo cách bạn cần. Khi phần đó được thực hiện, bạn có thể thay thế các giá trị khác hoặc sử dụng tính năng thay thế mặc định. "U có thể cho tôi biết bạn muốn tôi làm gì với mã mẫu nhỏ. Cảm ơn – Thomas

+0

Giới thiệu ngắn gọn về cụm từ thông dụng và cách sử dụng chúng để tìm Bạn có thể tìm thấy các mẫu ở đây: http://support.microsoft.com/kb/308252/en-us Nếu cụm từ thông dụng khớp với nhau, bạn sẽ biết có một vòng lặp. Các nhóm chụp sẽ chứa đối tượng/nhóm để lặp lại như một chuỗi (trong ví dụ của bạn '" Đơn hàng "') cũng như chuỗi định dạng được sử dụng cho mỗi đơn đặt hàng ('" ID đặt hàng {OrderId} ... "') .Nếu bạn không quen thuộc với cụm từ thông dụng, bằng cách sử dụng một giải pháp hoàn chỉnh/premade (chẳng hạn như một David đề nghị) có thể là giải pháp tốt hơn.Nếu muốn, có thể cố gắng để viết một ví dụ ngắn sau đó – Mario