将C#对象渲染为Html

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)?

你喜欢哪个?你知道一个好引擎吗?现在我更喜欢第二种解决方案,但它会非常慢.

谢谢

BFr*_*ree 5

我曾经需要将任何类型的集合呈现给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)


jri*_*sta 3

我非常同意约翰·费米内拉的观点。将 Html 渲染直接集成到您的域实体中是对域的可怕污染,完全是任意的和外部的关注。就像约翰所说,这样做会让你的实体变得非常脆弱,并打破这两个关键规则:关注点分离和单一责任。

从您给出的选择来看,#3 是最接近合适的方法。您无需编写自己的模板引擎。网上有很多免费的现成模板引擎可以胜任这项工作(NVelocity、StringTemplate、Brail 等)

继续在您的演示文稿/视图中呈现它所属的位置,并且不要因更高级别的问题而污染您的域。