如何从 html 块中创建格式化字符串?

How can I create a formatted string out of a block of html?

我需要向字符串列表的(字符串)成员提供可变位的数据(电子邮件的 "body"),我正在尝试使用 string.format 构建它,但我在 "http" 部分得到“) expected”:

string htmlBodyAmalgamation = string.Format(@"<html><body><img src=\"http://www.platypus.com/wp-
content/themes/platypus/images/pa_logo_notag.png\" alt=\"Platypus logo\" width=\"199\" height=\"130\" ><p>{0}</p>", body);

无论我在 "http".

前面添加了 0、1、2 还是 3 个反击(“\”),我都会收到错误消息

如果没有可变部分(如果body提前static/known)我可以这样做:

List<String> htmlBody = new List<string>
    {
        "<html><body><img src=\"http://www.platypus.com/wp-content/themes/platypus/images/pa_logo_notag.png\" alt=\"Platypus logo\" width=\"199\" height=\"130\" ><p>Your Platypus Price Push report is attached.</p>",
        "</body></html>"
    };
mailItem.HTMLBody = string.Join(Environment.NewLine, htmlBody.ToArray());

...而且效果很好。

所以它试图通过 string.format 嵌入变量 "body" 值,如下所示,这被证明是有问题的:

string htmlBodyAmalgamation = string.Format(@"<html><body><img src=\"http://www.platypus.com/wp-content/themes/platypus/images/pa_logo_notag.png\" alt=\"Platypus logo\" width=\"199\" height=\"130\" ><p>Your Platypus Price Push report is attached.</p>", body);
List<String> htmlBody = new List<string>
    {
        htmlBodyAmalgamation,
        "</body></html>"
    };

让 html 和 string.format 协同工作的技巧是什么?

我想分享我大约一年前使用的一个优雅的解决方案。 我们也为 e-mails 使用了 HTML 模板,发现 Razor 引擎实际上(显然)非常擅长这样做。

我们的代码如下:

    public string CompileMessage(string templateHtml, object modelClass)
    {
        try
        {
            TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration
            {
                Resolver = new TemplateResolver(),
                Language = Language.CSharp,
                Debug = true,
            };

            Razor.SetTemplateService(new TemplateService(templateConfig));

            return Razor.Parse(templateHtml, modelCLass);
        }
        catch (Exception ex)
        {
            Logger.Log4Net.Error("Failed to compile email template using Razor", ex);
            return "Error occurred (" + ex.Message + "). Check the logfile in the vicinity of " + DateTime.Now.ToLongTimeString() + ".";
        }
    }

好处:

  • 使用 Razor 为我们提供了类型安全的模型 "placeholders"
  • 我们已经涵盖了 XSS 和类似的攻击,因为 Razor 总是转义值,除非使用 @Html.Raw()
  • 它使业务用户能够相对安全地编辑模板,而不必担心 non-html 兼容字符
  • Razor 会在格式化字符串时处理 culture/ui 区域性

看起来很简单 - 使用单引号而不是双引号,并省略反击:

string htmlBodyAmalgamation = string.Format(@"<html><body><img src='http://www.platypus.com/wp-content/themes/platypus/images/pa_logo_notag.png' alt='Platypus logo' width='199' height='130' ><p>{0}</p>", body);

更简单,我可以去掉一些中间人,然后这样做:

mailItem.HTMLBody = string.Format(@"<html><body><img src='http://www.platypus.com/wp-content/themes/platypus/images/pa_logo_notag.png' alt='Platypus logo' width='199' height='130' ><p>{0}</p></body></html>", body);