3

我正在尝试以递归方式以编程方式发送目录中所有 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();
    }
 }
4

8 回答 8

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();
        }
于 2010-01-05T00:11:20.873 回答
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(所有标签都有结束标签等)。

于 2010-01-05T00:03:48.673 回答
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();
 }
于 2010-01-05T00:08:28.177 回答
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();

 }

不是真正的“面向对象”,但我认为最合乎逻辑。

免责声明:手工编译

于 2010-01-04T23:53:32.377 回答
2

标签就是标签。你必须写它们。

您可以使用 HtmlTextWriter 来进行实际的写作,但没有什么神奇的方法可以避免这种情况。

于 2010-01-04T23:50:50.123 回答
1

您正在做的事情似乎很简单,只需使用字符串缓冲区手动完成即可。如果这更复杂,我建议您使用诸如StringTemplate 之类的模板引擎。

于 2010-01-04T23:57:09.607 回答
1

您可以使用XmlWriter以更加面向对象的方式执行此操作:

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 文档中的持有者。

于 2010-01-04T23:57:43.693 回答
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();
}

SourceForge 上的 HTML++

于 2012-04-12T18:17:40.530 回答