C# 如何在带有变量字段的.NET应用程序中包含HTML文档?
我有一个C#/.NET应用程序,目前使用StringBuilder生成HTML电子邮件 一种新的消息格式已经开发出来,现在包括更多的格式和CSS。我希望避免使用StringBuilder追加文件的每一行,因此我认为最好将HTML文件作为一种资源 但是,CSS和HTML中大约有21个变量需要动态更改。我的第一个想法是用标准的String.Format占位符({0}、{1}等)替换它们,但是在查看HTML时,验证会抱怨这些占位符 对于存储一个200行HTML文件并在将其包含在电子邮件中之前更改其部分内容的最佳做法,我感到相当困惑 例如: 在CSS中,我需要更改某些元素的颜色,如下所示:C# 如何在带有变量字段的.NET应用程序中包含HTML文档?,c#,.net,html,embedded-resource,C#,.net,Html,Embedded Resource,我有一个C#/.NET应用程序,目前使用StringBuilder生成HTML电子邮件 一种新的消息格式已经开发出来,现在包括更多的格式和CSS。我希望避免使用StringBuilder追加文件的每一行,因此我认为最好将HTML文件作为一种资源 但是,CSS和HTML中大约有21个变量需要动态更改。我的第一个想法是用标准的String.Format占位符({0}、{1}等)替换它们,但是在查看HTML时,验证会抱怨这些占位符 对于存储一个200行HTML文件并在将其包含在电子邮件中之前更改其部分
#header
{
background-color: {0};
}
<img src="{1}" />
<span>{2}</span>
StreamReader reader = new StreamReader(Server.MapPath("Email/email.html"));
string email_html = reader.ReadToEnd();
reader.Close();
email_html = email_html.Replace("[link]", activation_link);
在HTML中,我需要更改字符串和URL,如下所示:
#header
{
background-color: {0};
}
<img src="{1}" />
<span>{2}</span>
StreamReader reader = new StreamReader(Server.MapPath("Email/email.html"));
string email_html = reader.ReadToEnd();
reader.Close();
email_html = email_html.Replace("[link]", activation_link);
{2}
将HTML作为资源包含在项目中似乎是最好的,但尝试使用该资源的String.Format,无论是否可行,都是一种糟糕的方法,因为前面提到的验证错误
有什么建议吗?我想你可以试试
使用t4模板,您甚至可以执行更复杂的操作,如
<table>
<# for (int i = 1; i <= 10; i++)
{ #>
<tr><td>Test name <#= i #> </td>
<td>Test value <#= i * i #> </td> </tr>
<# } #>
</table>
不要使用{1}请使用名称,例如Table1HeaderImage,然后不要使用String.Format,请使用String.Replace。
你可以在HTML中放一些东西,一个快速循环,甚至可以从用户版本中定制额外的属性,等等。我所做的是这样的:
#header
{
background-color: {0};
}
<img src="{1}" />
<span>{2}</span>
StreamReader reader = new StreamReader(Server.MapPath("Email/email.html"));
string email_html = reader.ReadToEnd();
reader.Close();
email_html = email_html.Replace("[link]", activation_link);
您可以使用Razor引擎呈现HTML字符串:
<h2>Items:</h2>
@foreach(var item in list)
{
<p>Item: @item.Description</p>
}
项目:
@foreach(列表中的变量项)
{
项目:@Item.Description
}
这些答案提供了一些很好的链接。我会使用
,
等,而不是{0}
,{1}
等
在运行时,您将:
将所有{
替换为{
并将}
替换为}
将所有
替换为}
String.Format()
你也可以按照瓦尔·巴赫金的建议,用名字代替数字。那么这个过程将是简单的:
将所有
替换为字典[“名称”]
您可以创建预处理的T4文本模板文件。
T4文本模板的一个很好的特性是,它们可以用来自动生成任何类型的文本文件 为什么在替换占位符之前“模板HTML”上的验证失败是一个问题?唯一重要的一点是,在用一些内容替换占位符后,它会正确验证!那你就得记住那意味着什么。你需要保持参数计数的一致性。使用可替换的标记,如和创建简单的find-replace方法来替换某个字典中的标记。这个问题就像一堆杂草中的玫瑰。我希望它能得到一个答案。这基本上就是我所做的;谢谢你的建议。我的中间名,也是其中的一部分。:)