我正在尝试以递归方式以编程方式将所有dll文件及其版本的电子邮件发送到目录中。我想使用表格将电子邮件作为HTML输出发送。是否有一个良好的面向对象的方式来做到这一点?我讨厌手工编写所有标签。
类似的东西:
private string getHTMLString()
{
DirectoryInfo di = new DirectoryInfo("some directory");
FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);
foreach (FileInfo file in files)
{
Assembly assembly = Assembly.LoadFile(file.FullName);
string version = assembly.GetName().Version.ToString();
}
}
答案 0 :(得分:8)
你可以通过实例化System.Web.UI.WebControls.Table,添加TableRows和TableCells然后将Table.RenderControl调用到HtmlTextWriter来实现它,但是要公平:那会很糟糕:)
var tbl = new System.Web.UI.WebControls.Table();
DirectoryInfo di = new DirectoryInfo("some directory");
FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);
foreach (FileInfo file in files)
{
Assembly assembly = Assembly.LoadFile(file.FullName);
string version = assembly.GetName().Version.ToString();
var tr = new System.Web.UI.WebControls.TableRow();
var tc = new System.Web.UI.WebControls.TableCell();
tc.Text = HttpUtility.HtmlEncode(version);
tr.Cells.Add(tc);
tbl.Rows.Add(tr);
}
using (var ts = new StringWriter())
using (var html = new System.Web.UI.HtmlTextWriter(ts))
{
// Not entirely sure about this part
tbl.RenderControl(html);
html.Flush();
string htmlString = ts.ToString();
}
答案 1 :(得分:7)
您实际上可以使用HtmlTextWriter并使用HtmlTextWriterTag枚举来创建标记,而无需实际手写“<”和“>”。
示例:
StringBuilder sb = new StringBuilder();
using (HtmlTextWriter w = new HtmlTextWriter(new StringWriter(sb)))
{
w.RenderBeginTag(HtmlTextWriterTag.P);
w.AddStyleAttribute(HtmlTextWriterStyle.Color, "red");
w.RenderBeginTag(HtmlTextWriterTag.Span);
w.Write("This is some text");
w.RenderEndTag();
w.RenderEndTag();
}
string html = sb.ToString();
它不会自动为您创建HTML,但它确实可以帮助您以“更多OO”方式编写HTML,它将帮助您(不确保)编写有效的HTML(所有标记都有结束标记等)。
答案 2 :(得分:7)
它可能有点过分,但您可以使用LINQ to XML生成HTML字符串......这是您的代码,使用LINQ和XElement生成一个简单的表。
唯一需要注意的是空标记,这些标记在HTML中无效为自关闭标记。例如,空的TD:new XElement("td")
将呈现为<td/>
,这是无效的HTML。您可以通过插入空字符串作为内容来解决此问题:new XElement("td", String.Empty)
- 这将输出<td></td>
。
private string GetHtmlString()
{
DirectoryInfo di = new DirectoryInfo("some directory");
FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);
var container = new XElement("table",
from file in files
let assembly = Assembly.LoadFile(file.FullName)
select new XElement("tr",
new XElement("td", file.FullName),
new XElement("td", assembly.GetName().Version.ToString())
)
);
return container.ToString();
}
答案 3 :(得分:5)
这样的东西?
private string getHTMLString()
{
DirectoryInfo di = new DirectoryInfo("some directory");
FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);
StringBuilder sb = new StringBuilder();
sb.Append("<table>");
foreach (FileInfo file in files)
{
Assembly assembly = Assembly.LoadFile(file.FullName);
string version = assembly.GetName().Version.ToString();
sb.AppendFormat("<tr><td>{0}</td><td>{1}</td></tr>", file.FullName, version);
}
sb.Append("</table>");
return sb.ToString();
}
不是真的“面向对象”,但我认为最合乎逻辑。
免责声明:手工编制
答案 4 :(得分:2)
标签是标签。你必须写它们。
您可以使用HtmlTextWriter进行实际写作,但没有神奇的方法可以避免这种情况。
答案 5 :(得分:1)
你正在做的事情似乎很简单,只需用字符串缓冲区手动完成。如果这更复杂,我建议您使用模板引擎,例如StringTemplate。
答案 6 :(得分:1)
您可以使用 XmlWriter 以更多OO方式执行此操作:
StringBuilder sb = new StringBuilder();
XmlWriter xmlWri = XmlWriter.Create(sb);
xmlWri.WriteStartElement("html");
{
xmlWri.WriteStartElement("body");
{
xmlWri.WriteAttributeString("bgcolor", "black");
// More html stuff
}
xmlWri.WriteEndElement(); // body
}
xmlWri.WriteEndElement(); // html
xmlWri.Flush();
xmlWri.Close();
string html = sb.ToString();
编辑:执行此操作确实相当麻烦,并且将来如果您想要更改HTML内容,则必须通过代码执行此操作。更好的方法是读取预格式化的HTML文档,其中占位符映射到表中的列,因此您需要的是循环遍历所有列并对该位置进行查找/替换的方法HTML文档中的持有者。
答案 7 :(得分:0)
我正在编写一个完全解决这个问题的库。它允许您使用集合初始值设定器构建HTML,因此它可以非常简洁。它还支持CSS样式,元素属性作为可选参数等。它是LGPL,所以你可以在任何地方使用它。
您的代码如下:
private string getHTMLString()
{
DirectoryInfo di = new DirectoryInfo("some directory");
FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);
var table = new Table();
foreach (FileInfo file in files)
{
Assembly assembly = Assembly.LoadFile(file.FullName);
string version = assembly.GetName().Version.ToString();
table.Add(new Tr { new Td { file.FullName }, new Td { version } });
}
return table.Render();
}