C# 如何在带有变量字段的.NET应用程序中包含HTML文档?

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文件并在将其包含在电子邮件中之前更改其部分

我有一个C#/.NET应用程序,目前使用StringBuilder生成HTML电子邮件

一种新的消息格式已经开发出来,现在包括更多的格式和CSS。我希望避免使用StringBuilder追加文件的每一行,因此我认为最好将HTML文件作为一种资源

但是,CSS和HTML中大约有21个变量需要动态更改。我的第一个想法是用标准的String.Format占位符({0}、{1}等)替换它们,但是在查看HTML时,验证会抱怨这些占位符

对于存储一个200行HTML文件并在将其包含在电子邮件中之前更改其部分内容的最佳做法,我感到相当困惑

例如:

在CSS中,我需要更改某些元素的颜色,如下所示:

#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方法来替换某个字典中的标记。这个问题就像一堆杂草中的玫瑰。我希望它能得到一个答案。这基本上就是我所做的;谢谢你的建议。我的中间名,也是其中的一部分。:)