【问题标题】:Render multiple dynamic hyperlink list in html email template在 html 电子邮件模板中呈现多个动态超链接列表
【发布时间】:2021-06-10 11:41:40
【问题描述】:

我正在尝试发送带有超链接到 html 电子邮件模板的列表,该列表包含多个项目(文档路径),但我只能在电子邮件中获取一个项目(列表中的第一项)。

asp.net 代码:

        private string GetEmailBody(List<string> blob)
         {            
            string strContent = string.Empty;
            StringBuilder body = new StringBuilder();               
            var webRequest = WebRequest.Create(@"https://email template path");

            using (var response = webRequest.GetResponse())
            using (var content = response.GetResponseStream())
            using (var reader = new StreamReader(content))
            {
                strContent = reader.ReadToEnd();
            }                
            var emailBody = strContent;
            body.Append(emailBody);
                        
              foreach (var path in blob.ToList())
            {
                body.Replace("{{Report.Path}}", path.ToString());
            }
            foreach (var name in fileName.ToList())
            {
                body.Replace("{{Report.Name}}", name.ToString());
            }

            return body.ToString();
        }           
    }

blob.ToList 包含路径列表。

fileName.ToList 包含文件名列表。

电子邮件 HTML 模板:

             <div align="center">
                <p>
                <ul>
                    <li> 
                 <a href="{{Report.Path}}" class="button">{{Report.Name}}</a>                       
                    </li>
                </ul>
                </p>
            </div>

我也尝试过使用 *ngFor 但没有成功。

我想展示这样的东西。目前它只显示 1 份报告,我需要列表中的所有报告 [

感谢任何建议/建议和帮助。谢谢

【问题讨论】:

    标签: c# html list asp.net-core


    【解决方案1】:

    您的电子邮件模板只有一个&lt;li&gt; 元素(作为列表项的模板)。您的代码实际上第一次替换了它,并且所有下一次都无法替换(什么都不替换)。这里需要做以下步骤:

    • 找到父元素&lt;ul&gt;
    • 从第一个&lt;li&gt; 中提取列表项模板,然后删除该&lt;li&gt;
    • 使用提取的列表项模板替换为每个条目的值以获取列表项 html。
    • 将新的&lt;li&gt; 元素从替换的html 添加到父&lt;ul&gt;

    您可以使用一些库来帮助解析和修改一般的 XML 或特定的 HTML,例如 htmlagilitypack。然而它只是工具之一,上述步骤是最重要的(要实现的基本逻辑/算法的种类)。这里我介绍一种使用框架内置的System.Xml.Linq(或Linq-to-xml)的方法。这更方便,但它需要严格的 XML 格式才能使用。我想你可以确保为你的电子邮件模板。

    var xdoc = XDocument.Parse(emailBody);
    //NOTE: this supposes there is only one <ul>
    var ul = xdoc.Descendants().FirstOrDefault(e => e.Name.ToString().ToLower() == "ul")
    //the list item template
    var li = ul.FirstNode;
    //get the actual template
    var template = li.CreateNavigator().InnerXml;
    //remove the template item, we'll add all later
    li.Remove();
    //suppose the number of report paths should be equal to the number of filenames
    var listItems = blob.Zip(filename, (path,name) => {
                        var liHtml = template.Replace("{{Report.Path}}", path)
                                             .Replace("{{Report.Name}}", name);
                        return new XElement("li", XElement.Parse(liHtml));  
                    });
    //add the list items to the parent <ul>
    foreach(var listItem in listItems){
        ul.Add(listItem);
    }
    
    //finally return the processed template
    return xdoc.ToString();
    

    对于无效的 xml(来自您的电子邮件模板),代码可以抛出 XmlException,您可以尝试捕获它并提供有用的异常或消息以发送给客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 2022-01-24
      • 2020-09-18
      • 2011-01-11
      • 2019-11-30
      相关资源
      最近更新 更多