如何从 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);
我需要向字符串列表的(字符串)成员提供可变位的数据(电子邮件的 "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);