2013-12-01 2 views
0

У меня есть DataTable записей, которые мне нужно добавить в качестве информации на мой шаблон электронной почты htm. В настоящее время то, что я делаю здесь, работает нормально, но это, если у меня только 1 строка записи. Как я могу идти о Добавляя шаблон HTM таким образом, что я могу иметь несколько проводок в электронной почтеC# + Добавить шаблон DataTable в html шаблон электронной почты

например Пример экрана Email (Предполагается, что мой DataTable возвращает 3 рядов записи):

Dear Sir, your daily car posting results: 

Image 
Toyota 
Cambry 
$10000 

Image 
Honda 
GT 
$10000 

Image 
Nissan 
Sunny 
$10000 

Loop DataTable ряд:

for (int i = 0; i < dt.Rows.Count; i++) 
       { 
        DataRow dr = dt.Rows[i]; 

        primaryImage = dr["PrimaryImage"].ToString(); 
        email = dr["Email"].ToString(); 
        postTitle = dr["Model"].ToString(); 
        model = dr["Model"].ToString(); 
        askingPrice = dr["AskingPrice"].ToString(); 

        var mail = new Email(); 
        mail.IsBodyHtml = true; 
        mail.MailAddresses = email; 
        mail.MailSubject = "Test"; 

        mail.HtmFileName = "Email.htm"; 
        var dict = new Dictionary<string, string> 
            { 
             {"<%PrimaryImage%>", primaryImage }, 
             {"<%PostTitle%>", postTitle}, 
             {"<%Model%>", model}, 
             {"<%AskingPrice%", askingPrice} 
            }; 
        mail.Dict = dict; 

        MailMessage mailMessage; 
        mailMessage = mail.CreateMailMessage(); 
        Email.Send(mailMessage, 3, 3000, true); 
        } 
       } 

Создание почтового сообщения:

public MailMessage CreateMailMessage() 
     { 
      MailMessage mail = new MailMessage(); 
      mail.IsBodyHtml = IsBodyHtml; 
      mail.From = new MailAddress("[email protected]", "xxx"); 
      mail.Bcc.Add(MailAddresses); 
      mail.Subject = MailSubject; 
      string body = ""; 
      string filePath = 
       HttpContext.Current.Server.MapPath("~/" + ConfigurationManager.AppSettings["TEMPLATES"] + "/"); 

      if (File.Exists(filePath + HtmFileName)) 
      { 
       FileStream f = new FileStream(filePath + HtmFileName, FileMode.Open); 
       StreamReader sr = new StreamReader(f); 
       body = sr.ReadToEnd(); 
       foreach (var pair in Dict) 
       { 
        body = body.Replace(pair.Key, pair.Value); 
       } 
       f.Close(); 
      } 

      mail.Body = body; 
      mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess | 
               DeliveryNotificationOptions.OnFailure; 
      return mail; 
     } 

Порция шаблона Email.htm:

<body> 
    <form id="form1" runat="server"> 
     <div style="border: thin solid #E1E1E1; background-color: #F0F0F0; margin-bottom: 10px; padding-top: 3px; padding-bottom: 3px; padding-left:5px;"> 
      Postings 
     </div> 
     <div> 
      <a><img src="<%PrimaryImage%>"/></a> 
      <br/><br/> 
      Sell Post Title: <%PostTitle%> 
      <br/><br/> 
      Model: <%Model%> 
      <br/><br/> 
      Asking Price: <%AskingPrice%> 
     </div> 
    </form> 
</body> 

ответ

0

Я всегда использовал HtmlAgilityPack подготовить htmlcontent и достичь таких вещей.

private string PrepareHtmlContent(List<DataRow> dataTable) 
    { 

     var htmlDocument = new HtmlDocument(); 
     var html = EmailTemplates.GetTemplate("yourTemplate"); 
     htmlDocument.LoadHtml(html); 
     var recordsContainerNode = htmlDocument.GetElementbyId("dataTable"); 

     if (recordsContainerNode != null) 
     { 
      var innerHtml = ""; 

      foreach (var entry in dataTable) 
      { 

       innerHtml += "<tr>"; 

       innerHtml += "<td>" + entry.PrimaryImage + "</td> "; 
       innerHtml += "<td>" + entry.Model + "</td> "; 
       innerHtml += "<td>" + entry.AskingPrice + "</td> "; 
       innerHtml += "</tr>"; 
      } 


      recordsContainerNode.InnerHtml = innerHtml; 
     } 

    using (var stringWriter = new StringWriter()) 
     { 
      htmlDocument.Save(stringWriter); 
      return stringWriter.GetStringBuilder().ToString(); 
     } 
} 

И ваш шаблон должен быть STH как этот

<body> <form id="form1" runat="server"> <div style="border: thin solid #E1E1E1; background-color: #F0F0F0; margin-bottom: 10px; padding-top: 3px; padding-bottom: 3px; padding-left:5px;"> Postings </div> <table> <thead> </thead> <tbody id="dataTable"> </tbody> </table> </form> </body>

+0

Не могли бы вы рассказать, как добавить атрибуты к двум различным ? –

+0

Как вы добавляете td? Один из способов добавления атрибута - использовать метод SetAttribute на узле объекта HtmlNode.SetAttributeValue («стиль», значение) – Sameer

+0

Я использую приведенный вами пример. там в foreach добавляя 3 td к innerHtml. Но у меня есть отдельный атрибут для каждого td. теперь я помещаю как строку в td. например "". Есть ли другой эффективный способ? –

2

@ M.S.,: Там должно быть какое-то условие, на основании которого будет решить, какой атрибут идет, к которому тд. Вы можете завершить эту логику некоторым методом и сгенерировать имя класса. Ниже приведен способ создания имени класса на основе rownum.

var className="" ; 
var rowNum=0;  
foreach (var entry in dataTable) 
    { 
     className=GetClassName(rowNum) 
     innerHtml += "<tr>"; 
     innerHtml += "<td class='"+ className +"'>" + entry.PrimaryImage + "</td> "; 
     innerHtml += "</tr>"; 
     rowNum++; 
    } 

public static string GetClassName(int rowCount) 
{ 
    switch (rowCount) 
    { 
     case 1: 
      return "class1"; 
     case 2: 
      return "class2"; 
     case 3: 
      return "class3"; 
     default: 
      return "unassignedClass"; 
    } 
} 
+0

Спасибо @Sameer. Дает мне представление о том, как его решить. Большой!! Попробуй это. –

Смежные вопросы