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

Dav*_*son 3 html c# 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();
    }
 }
Run Code Online (Sandbox Code Playgroud)

Mic*_*tum 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();
        }
Run Code Online (Sandbox Code Playgroud)

  • 这可能是最"OO"的做法.但是啊..吓人. (2认同)

bdo*_*den 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();
Run Code Online (Sandbox Code Playgroud)

它不会自动为您创建HTML,但它确实帮助您以"更多OO"方式编写HTML,它将帮助您(不确保)编写有效的HTML(所有标签都有结束标记等).


Joe*_*ler 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();
 }
Run Code Online (Sandbox Code Playgroud)


mle*_*rle 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();

 }
Run Code Online (Sandbox Code Playgroud)

不是真的"面向对象",但我认为最合乎逻辑.

免责声明:手工编制