【问题标题】:Convert to html (nested ul li) from list in C#从 C# 中的列表转换为 html(嵌套的 ul li)
【发布时间】:2015-10-07 12:45:30
【问题描述】:

我有一个如下列表(示例):

但此列表只是逻辑示例。该列表应该是动态的。列表字段可能有3个以上并且列表可以有子的集合(数据格式如json)

我想转换嵌套的 ul-li html 标签。我认为,我可以通过如下反思来做到这一点。但我第一次习惯了反射。我的代码现在就像下面一样。我该怎么办?

    public static string ConvertToHtml<T>(IEnumerable<T> list) where T : class
    {
        StringBuilder html = new StringBuilder();
        foreach (var item in list)
        {
            Type itemType = item.GetType();
            if (itemType.IsClass)
            {
                FieldInfo[] fieldInfo = itemType.GetFields(BindingFlags.Public | BindingFlags.Instance); // Field?
                if (fieldInfo.Any())
                {
                    foreach (var field in fieldInfo)
                    {
                        var name = field.Name;
                        var value = field.GetValue(item);
                    }
                }
                PropertyInfo[] propertyInfo = itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance); // Property?
                if (propertyInfo.Any())
                {
                    foreach (var property in propertyInfo)
                    {
                        var name = property.Name;
                        var value = property.GetValue(item);
                    }
                }

            }
        }
        return string.Empty;
    }

【问题讨论】:

  • 在服务器端执行此转换的基本原理是什么?为什么不使用前端模板框架?

标签: javascript c# html reflection converter


【解决方案1】:

您很可能选择了错误的方法来完成任务。反射通常用于查询运行时代码结构,如类型、它们的字段、属性和方法。最常见的用例是创建任意类型的序列化/反序列化方法。

在您的情况下,它看起来不像是任意结构 - 即使它支持无限(概念上)嵌套级别(如 JSON),您也有非常严格的数据结构。换句话说,你有“树”https://en.wikipedia.org/wiki/Tree_(data_structure)

要遍历它,存在几种算法:https://en.wikipedia.org/wiki/Tree_traversal 当然,对于大多数算法,您可以轻松找到示例实现:Implementing Depth First Search into C# using List and Stack 但问题比您想象的要棘手,因为您首先需要理解这个概念.

树遍历算法通常是递归的。所以为了把它做好,你也必须进入这个概念。

之后构建列表的代码就很简单了:

public class Node {
    string Name { get; set; }
    IList<Node> Subnodes { get; private set; }
}

private void BuildList(Node node, StringBuilder sb) {
    sb.Append("<ul>");
    foreach (var n in node.Subnodes) {
        sb.Append("<li>" + n.Name);
        BuildList(n, sb);
        sb.Append("</li>");
    }
    sb.Append("</ul>");
}

public string BiuldList(Node root) {
    var sb = new StringBuilder();
    BuildList(root, sb);
    return sb.ToString();
}

编辑

使用给定的代码,它会在没有孩子的&lt;li&gt;&lt;/li&gt; 项目中生成空的&lt;ul&gt;&lt;/ul&gt; 标记。所以我做了一个小改动,添加了一个条件,只在有孩子时才创建子列表。

代码:

private void BuildList(Node node, StringBuilder sb) {
       if(node.Subnodes.Count > 0){
            sb.Append("<ul>");
            foreach (var n in node.Subnodes) {
                sb.Append("<li>" + n.Name);
                BuildList(n, sb);
                sb.Append("</li>");
            }
            sb.Append("</ul>");
        }
    }

【讨论】:

  • 呃..你救了我的命兄弟。谢谢你。它就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2017-12-20
  • 2013-01-27
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
相关资源
最近更新 更多