2017-03-01 78 views
1

我有一個html模板來發送電子郵件。我如何獲得表標記並動態注入所有行?注入HTML模板中的表發送電子郵件c#

HTML模板:

Hello {Username}! 

<table class="tblCss"> 
<tr> 
    <th> Name </th> 
    <th> Age </th> 
</tr> 
</table> 

CS文件

string body = string.Empty; 
using(StreamReader reader = new StreamReader("HtmlTemplate.html"))) 
{ 
    body = reader.ReadToEnd(); 
} 

body = body.Replace("{Username}", "test"); 
+0

你是不是做錯了。但是您的示例HTML – NicoRiff

+0

上沒有{用戶名}這看起來像是在嘗試構建自己的html視圖渲染引擎。你能改變模板或代碼嗎? – Tim

+0

你能改變模板嗎?它只是名字和年齡?你在哪裏存儲行的值?你試過什麼了? – xszaboj

回答

1

這是我自己的建議。如果你使用的是MVC,爲你的電子郵件創建一個獨立的視圖(比如myemail.cs)併爲它分配一個模型(myemailModel)。

這是你的myemailModel類

public class myemailModel { 
    public string Username{get;set;} 
    public IList<Data> data{get;set;} 
    public class Data{ 
     public string Name{get;set;} 
     public int Age{get;set;} 

    } 
} 

所以,你的看法是這樣的:

@model myemailModel 

<html> 
<body> 
Hello @Model.Email! 

@if (Model.data !=null && Model.data.count() >0) 
{ 


    <table class="tblCss"> 
    <tr> 
    <th> Name </th> 
    <th> Age </th> 
    </tr> 
    foreach (var i in Model.data) 
    { 
     <tr> 
     <td>@i.Name</td> 
     <td>@i.Age</td> 
     </tr> 
    } 
</table> 


} 


</body> 

</html> 

最後,你需要渲染視圖轉換爲字符串。使用下面的方法(Render a view as a string):

public string RenderRazorViewToString(string viewName, object model) 
{ 
    ViewData.Model = model; 
    using (var sw = new StringWriter()) 
    { 
    var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, 
                 viewName); 
     var viewContext = new ViewContext(ControllerContext, viewResult.View, 
          ViewData, TempData, sw); 
    viewResult.View.Render(viewContext, sw); 
    viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View); 
    return sw.GetStringBuilder().ToString(); 
    } 
} 

,並調用上面的方法來獲得身體:

string body = RenderRazorViewToString("myemail", new myemailModel { 
     Username="foo", 
      data = new List<myemailModel>{ 
      // fill it 
      } 
     }); 
+0

避免在電子郵件中使用css類。他們被流行的電子郵件服務終止。 – AHBagheri