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)
您可以通过实例化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)
您实际上可以使用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(所有标签都有结束标记等).
它可能有点过分,但您可以使用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)
像这样的东西?
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)
不是真的"面向对象",但我认为最合乎逻辑.
免责声明:手工编制