C# Web API:迭代数组并附加到 HTML table

C# Web API: Iterating Array and Append to HTML table

我正在尝试创建一个 POST 端点,如果成功,它将发送一封包含 POST 数据的 HTML 电子邮件。我正在努力尝试迭代 JSON 对象数组并将该数据附加到 HTML table.

JSON数据:

{
   "Submitter":[
      {
         "Obj1":[
            "test",
            "test2"
         ]
      },
      {
         "Obj2":[
            "test3",
            "test4"
         ]
      }
   ]
}

测试控制器:

    public class Testing2Controller : ControllerBase
    {
        public class Submitter
        {
            public List<string> Obj1 { get; set; }
            public List<string> Obj2 { get; set; }
        }

        public class MyData
        {
            public List<Submitter> Submitter { get; set; }
        }

        public string POST([FromBody] MyData data)
        {

            string composeTableObj1 = @"";
            string composeTableObj2 = @"";


            foreach (var item in data.Submitter)
            {
                composeTableObj1 += $"<tr>"; //start row tag
            //Column 1 Obj1 data
            if (item.Obj1 != null)
                {
                    foreach (var objItem in item.Obj1)
                    {
                        composeTableObj1 += $"<td>{objItem}</td>";
                    }
                }

                //Column 2 Obj2 data
                if (item.Obj2 != null)
                {

                    foreach (var objItem in item.Obj2)
                    {
                        composeTableObj1 += $"<td>{objItem}</td>";
                    }
                }
                composeTableObj1 += $"</tr>"; //end row tag


        }

            string body = @$"<table>
<thead>
<tr>
    <th>Object 1</th>
    <th>Object 2</th>
</tr>
</thead>
<tbody>
{composeTableObj1}
</tbody>
</table>
";

            return body;
        }
    }

上面的代码给了我以下不想要的结果:

| Object 1 | Object 2 |
|----------|----------|
| test     | test2    |
| test3    | test4    |

这是我想要的结果:

| Object 1 | Object 2 |
|----------|----------|
| test     | test3    |
| test2    | test4    |

在这上面卡了好久,TIA!

看起来你的 HTML 有点不对劲 - 像这样写 HTML 会很乏味。我猜测基于 HTML 中的硬编码 table header 和 Submitter class 的结构,你将只有两个 Objn 项在您的 JSON 中。如果这是真的,您可以放弃 foreach 循环而使用 for 循环,并使用循环迭代器从 data.Submitter[n] 中获取值:

public string Post([FromBody] MyData data)
{
    string composeTableObj = ""; 

    for (int i = 0; i < data.Submitter.Count(); i++)
    {
        composeTableObj += $"<tr>"; //start row tag
        composeTableObj += $"<td>{data.Submitter[0].Obj1[i]}</td>";
        composeTableObj += $"<td>{data.Submitter[1].Obj2[i]}</td>";
        composeTableObj += $"</tr>"; //end row tag
    }

    return @$"<table><thead><tr><th>Object 1</th><th>Object 2</th></tr></thead><tbody>{composeTableObj}</tbody></table>";
}

渲染:

返回 HTML:

<table><thead><tr><th>Object 1</th><th>Object 2</th></tr></thead><tbody><tr><td>test</td><td>test3</td></tr><tr><td>test2</td><td>test4</td></tr></tbody></table>

显然,这不是很动态。如果您发现需要更多 Objn,则需要更新 Submitter class,并且必须在循环内添加代码(并添加另一个 header 为了你的 HTML).


如果 Obj 数组中有更多项目,您可以执行以下操作:

public string Post([FromBody] MyData data)
{
    string composeTableObj = "";

    int obj1Count = data.Submitter[0].Obj1.Count;
    int obj2Count = data.Submitter[1].Obj2.Count;

    int loopCount = obj1Count >= obj2Count ? obj1Count : obj2Count;

    for (int i = 0; i < loopCount; i++)
    {
        string obj1String = obj1Count <= i ? " " : data.Submitter[0].Obj1[i];
        string obj2String = obj2Count <= i ? " " : data.Submitter[1].Obj2[i];

        composeTableObj += $"<tr>"; //start row tag
        composeTableObj += $"<td>{obj1String}</td>";
        composeTableObj += $"<td>{obj2String}</td>";
        composeTableObj += $"</tr>"; //end row tag
    }

    return  @$"<table><thead><tr><th>Object 1</th><th>Object 2</th></tr></thead><tbody>{composeTableObj}</tbody></table>";
}

这首先获取 Obj 列表之间的两个 .Count 中的较大者以设置循环条件,然后执行索引边界检查。如果 objnCount 小于或等于 i,则将其设置为 space,否则为其各自的 Obj 列表取值。 Obj2 中有 6 个项目,Obj1 中只有 2 个项目,HTML 看起来像这样:

返回 HTML:

<table><thead><tr><th>Object 1</th><th>Object 2</th></tr></thead><tbody><tr><td>test</td><td>test3</td></tr><tr><td>test2</td><td>test4</td></tr><tr><td> </td><td>test5</td></tr><tr><td> </td><td>test6</td></tr><tr><td> </td><td>test7</td></tr><tr><td> </td><td>test8</td></tr></tbody></table>