C# Web API:迭代数组并追加到 HTML 表

Posted

技术标签:

【中文标题】C# Web API:迭代数组并追加到 HTML 表【英文标题】:C# Web API: Iterating Array and Append to HTML table 【发布时间】:2021-11-18 16:36:35 【问题描述】:

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

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!

【问题讨论】:

***.com/questions/51075865/… 请通过此链接。 @AmalPs 你链接的帖子与我的问题完全无关 循环中的字符串连接效率非常低,因为它会在内存中产生大量垃圾。因此,您需要使用 StringBuilder,或者直接写入输出流。或者,您可以使用 System.Xml.Linq 命名空间中的 XElement 类的功能 - 这将允许您以面向对象的样式创建 html。另一种方法是使用 Razor 在视图中创建 html。您选择了最糟糕的方式,效率低下,容易出错且难以维护。 【参考方案1】:

看起来您的 HTML 有点偏离 - 编写这样的 HTML 可能很乏味。我猜测基于 HTML 中的硬编码表头和 Submitter 类的结构,您的 JSON 中只会有两个 Objn 项目。如果这是真的,您可以放弃 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:

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Object 1&lt;/th&gt;&lt;th&gt;Object 2&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;test&lt;/td&gt;&lt;td&gt;test3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;test2&lt;/td&gt;&lt;td&gt;test4&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

显然,这不是很动态。如果您发现需要更多 Objn,则需要更新 Submitter 类,并且必须在循环中添加代码(并为您的 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,则将其设置为空格,否则取其各自Obj 列表的值。 Obj2 中有 6 项,Obj1 中只有 2 项,HTML 如下所示:

返回的 HTML:

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Object 1&lt;/th&gt;&lt;th&gt;Object 2&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;test&lt;/td&gt;&lt;td&gt;test3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;test2&lt;/td&gt;&lt;td&gt;test4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;test5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;test6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;test7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;test8&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

【讨论】:

这很棒,虽然就像你说的那样,它不是很有活力。例如,如果Obj1 JSON array 中有更多值,则不会渲染它,因为它只会循环直到data.Submitter.Count 结束。如果Obj1 or Obj2 arrays 包含更多值,有没有办法让它更有活力? @ayushlal 您可以获得 Obj1 或 Obj2 中项目的最高计数并将其用作循环条件,并对相应 Obj 列表中的每个索引执行计数检查。如果i 是> 则Obj 的计数,然后为&lt;td&gt; 插入一个空白字符串,否则插入它的值。我假设空白不会抛出 HTML。插入" " 可能更安全因此,如果 Obj1 有 5 个项目,而 Obj2 有 6 个项目,则您将循环 6 次,而在第 6 次迭代中,data.Submitter[0].Obj1[i] 将超出范围,因此为其插入一个空格。跨度> 非常感谢,我在想同样的事情。如果可以,请更新您的答案,那将是很棒的! @ayushlal 看起来可以工作。

以上是关于C# Web API:迭代数组并追加到 HTML 表的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中追加数组的最有效方法?

如何在 C# 中迭代​​数组值并更新多条记录 [关闭]

C#知识点-枚举器和迭代器

如何从 C# 中的 Web Api 方法正确获取字节数组?

CKEditor 和 C# Web API,使用简单的上传插件上传图片

无法反序列化 xml 数组以列出 web api 模型 c#