C# - 面向对象的HTML编写方式?

时间:2010-01-04 23:47:45

标签: c# html oop htmltextwriter

我正在尝试以递归方式以编程方式将所有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();
    }
 }

8 个答案:

答案 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();
}

HTML++ on SourceForge