You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中如何将IFormCollection中的索引集合转换为JSON数组

我之前在做ASP.NET Core MVC项目时也碰到过一模一样的需求,给你两个靠谱的解决思路,优先推荐第一个,省心又高效:

方法一:利用ASP.NET Core内置模型绑定(最推荐)

ASP.NET Core的模型绑定原生就支持这种People[0].Name格式的表单字段,直接映射到强类型集合里,完全不用手动处理IFormCollection。

首先定义你的Person模型:

public class Person
{
    public string Name { get; set; }
    // 如果有其他属性,比如Age,直接加在这里就行
}

然后在控制器的Action里直接用List<Person>或者Person[]作为参数:

[HttpPost]
public async Task<IActionResult> SubmitForm(List<Person> People)
{
    // 直接把集合序列化为JSON数组,传给你的微服务
    var jsonArray = JsonSerializer.Serialize(People);
    
    // 接下来就可以调用微服务API,把jsonArray传过去
    // ...
    
    return Ok();
}

注:如果你的项目用的是Newtonsoft.Json而非默认的System.Text.Json,就换成JsonConvert.SerializeObject(People)即可。

这种方式的好处是框架帮你做了所有的解析、类型转换和错误处理,比手动写逻辑可靠得多。

方法二:手动解析IFormCollection(适用于必须用IFormCollection的场景)

如果因为某些特殊业务限制,必须用IFormCollection接收表单数据,那可以自己写个解析逻辑,把带索引的键转换成对象数组:

先写一个辅助方法来解析表单:

private List<Person> ParsePeopleFromForm(IFormCollection form)
{
    var peopleList = new List<Person>();
    
    // 筛选出所有以"People["开头的表单键
    var personRelatedKeys = form.Keys.Where(key => key.StartsWith("People["));
    
    // 提取所有唯一的索引值(比如0、1、2...)
    var uniqueIndexes = personRelatedKeys
        .Select(key => int.Parse(key.Split('[', ']')[1]))
        .Distinct();
    
    // 遍历每个索引,构建Person对象
    foreach (var index in uniqueIndexes)
    {
        var nameKey = $"People[{index}].Name";
        if (form.TryGetValue(nameKey, out var nameValue))
        {
            peopleList.Add(new Person { Name = nameValue.ToString() });
        }
        
        // 如果有其他属性,比如Age,就加类似的逻辑:
        // var ageKey = $"People[{index}].Age";
        // if (form.TryGetValue(ageKey, out var ageValue) && int.TryParse(ageValue, out var age))
        // {
        //     person.Age = age;
        // }
    }
    
    return peopleList;
}

然后在控制器里调用这个方法,再序列化:

[HttpPost]
public async Task<IActionResult> SubmitForm(IFormCollection form)
{
    var people = ParsePeopleFromForm(form);
    var jsonArray = JsonSerializer.Serialize(people);
    
    // 调用微服务API传递数据
    // ...
    
    return Ok();
}

小提示

如果后续Person类新增属性,只需要在解析方法里对应添加字段的提取逻辑即可,扩展性也不错。

内容的提问来源于stack exchange,提问作者Brian Driscoll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:31:40