rab*_*ani 7 html c# rendering template-engine
我们有一堆域实体应该呈现为html格式,在弹出窗口中显示它们的详细信息.
我很乐意做这样的事情:
Product product = new Product(...);
product.ToHtml(); // or: HtmlRenderer.Render(Product);
Run Code Online (Sandbox Code Playgroud)
但我的主要问题是如何从后面做这些事情.我有3个不同的答案:
1.按代码渲染:
我可以简单地编写我的代码来在ToHtml方法(C#)中呈现Html - 问题是它太静态了.如果你想将标题移动到中间,你应该改变代码.而且,在C#中读取Html缩进非常困难.
2.使用XSL:
XSL文件可以轻松管理Html模板并使用XSLT我可以将XML文件转换到文档的正确位置.解析器已经由其他人编写(只需要学习语法)**为此我们需要每个对象都可以序列化为Xml.如果对象发生了变化 - > Xml将被更改 - > xslt也需要更改**这也会让我选择简单地缩进html例如:添加css功能和\或更改html设计
3.使用其他模板引擎:
编写我自己的C# - > Html模板引擎,这样它将从文件(*.template)中读取模板,并使用反射将正确的属性插入模板的正确位置.**在这个解决方案中,我们可以考虑许多问题,例如:语法应该如何?这件事好吗? %Name %% Description%以及我们如何处理数组?**也许我们可以使用现有的发动机(Brail或T4-Templating)?
你喜欢哪个?你知道一个好引擎吗?现在我更喜欢第二种解决方案,但它会非常慢.
谢谢
我曾经需要将任何类型的集合呈现给Html表.我在IEnumerable <T>上创建了一个扩展方法,它有css等的重载.你可以在这里看到我的博客文章:
http://crazorsharp.blogspot.com/2009/03/cool-ienumberable-extension-method_25.html
它使用反射来获取对象的所有属性,并呈现一个漂亮的小表.看看这是否适合你.
[System.Runtime.CompilerServices.Extension()]
public string ToHtmlTable<T>(IEnumerable<T> list, string propertiesToIncludeAsColumns = "")
{
return ToHtmlTable(list, string.Empty, string.Empty, string.Empty, string.Empty, propertiesToIncludeAsColumns);
}
[System.Runtime.CompilerServices.Extension()]
public string ToHtmlTable<T>(IEnumerable<T> list, string tableSyle, string headerStyle, string rowStyle, string alternateRowStyle, string propertiesToIncludeAsColumns = "")
{
dynamic result = new StringBuilder();
if (String.IsNullOrEmpty(tableSyle)) {
result.Append("<table id=\"" + typeof(T).Name + "Table\">");
} else {
result.Append((Convert.ToString("<table id=\"" + typeof(T).Name + "Table\" class=\"") + tableSyle) + "\">");
}
dynamic propertyArray = typeof(T).GetProperties();
foreach (object prop in propertyArray) {
if (string.IsNullOrEmpty(propertiesToIncludeAsColumns) || propertiesToIncludeAsColumns.Contains(prop.Name + ",")) {
if (String.IsNullOrEmpty(headerStyle)) {
result.AppendFormat("<th>{0}</th>", prop.Name);
} else {
result.AppendFormat("<th class=\"{0}\">{1}</th>", headerStyle, prop.Name);
}
}
}
for (int i = 0; i <= list.Count() - 1; i++) {
if (!String.IsNullOrEmpty(rowStyle) && !String.IsNullOrEmpty(alternateRowStyle)) {
result.AppendFormat("<tr class=\"{0}\">", i % 2 == 0 ? rowStyle : alternateRowStyle);
} else {
result.AppendFormat("<tr>");
}
foreach (object prop in propertyArray) {
if (string.IsNullOrEmpty(propertiesToIncludeAsColumns) || propertiesToIncludeAsColumns.Contains(prop.Name + ",")) {
object value = prop.GetValue(list.ElementAt(i), null);
result.AppendFormat("<td>{0}</td>", value ?? String.Empty);
}
}
result.AppendLine("</tr>");
}
result.Append("</table>");
return result.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我非常同意约翰·费米内拉的观点。将 Html 渲染直接集成到您的域实体中是对域的可怕污染,完全是任意的和外部的关注。就像约翰所说,这样做会让你的实体变得非常脆弱,并打破这两个关键规则:关注点分离和单一责任。
从您给出的选择来看,#3 是最接近合适的方法。您无需编写自己的模板引擎。网上有很多免费的现成模板引擎可以胜任这项工作(NVelocity、StringTemplate、Brail 等)
继续在您的演示文稿/视图中呈现它所属的位置,并且不要因更高级别的问题而污染您的域。
归档时间: |
|
查看次数: |
11234 次 |
最近记录: |