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

Asp.net MVC上传CSV文件仅返回单行JSON,请求技术支持

问题分析与解决方案

你遇到的问题核心有两个:

  • 循环中复用同一个FileUploadViewModel实例,每次赋值都是覆盖同一个对象的属性,最终只有最后一行数据保留在这个对象里。
  • 没有将解析后的每一行对象添加到列表中,最后返回的是单个对象而非整个数据数组。

修正后的Controller代码

[HttpPost]
public ActionResult AddparcelView(FileUploadViewModel filedata)
{
    var attachedFile = System.Web.HttpContext.Current.Request.Files["CsvDoc"];
    if (attachedFile == null || attachedFile.ContentLength <= 0)
        return Json(null);

    var csvReader = new StreamReader(attachedFile.InputStream);
    var uploadModelList = new List<FileUploadViewModel>();
    string inputDataRead;
    var values = new List<string>();

    while ((inputDataRead = csvReader.ReadLine()) != null)
    {
        values.Add(inputDataRead.Trim().Replace(" ", "").Replace(",", " "));
    }

    // 移除表头和最后一行(确保列表有数据再操作,避免索引越界)
    if(values.Count > 0) values.RemoveAt(0);
    if(values.Count > 0) values.RemoveAt(values.Count - 1);

    foreach (var value in values)
    {
        var eachValue = value.Split(' ');
        // 关键:每次循环创建新的对象实例,避免复用同一个对象覆盖数据
        var uploadModelRecord = new FileUploadViewModel();
        
        // 增加数组长度判断,避免格式异常导致索引越界
        uploadModelRecord.Name = eachValue.Length > 0 && eachValue[0] != "" ? eachValue[0] : string.Empty;
        uploadModelRecord.School = eachValue.Length > 1 && eachValue[1] != "" ? eachValue[1] : string.Empty;
        uploadModelRecord.Age = eachValue.Length > 2 && eachValue[2] != "" ? eachValue[2] : string.Empty;
        uploadModelRecord.DOB = eachValue.Length > 3 && eachValue[3] != "" ? eachValue[3] : string.Empty;
        uploadModelRecord.ParentName = eachValue.Length > 4 && eachValue[4] != "" ? eachValue[4] : string.Empty;

        // 将当前行的对象添加到列表中,保存所有数据
        uploadModelList.Add(uploadModelRecord);
    }

    // 返回整个列表的JSON数组,而非单个对象
    return Json(uploadModelList);
}

关键修改点说明

  1. 创建独立对象实例:把uploadModelRecord的声明移到foreach循环内部,确保每一行数据都对应一个全新的对象,避免后续赋值覆盖之前的行数据。
  2. 收集所有行数据:每次解析完一行后,将新对象添加到uploadModelList中,让列表保存所有行的解析结果。
  3. 返回完整数组:最后返回uploadModelList,接口就会输出包含所有行数据的JSON数组,而不是单个对象。
  4. 增加安全判断:访问数组索引前先判断长度,避免因CSV行格式异常导致的程序崩溃。

额外建议

你当前手动处理CSV的方式(替换逗号为空格再分割)有潜在风险,如果CSV字段本身包含空格(比如ParentName是John Doe),这种处理会把字段拆成两部分导致数据错误。建议使用成熟的CSV解析库(比如CsvHelper),它能更安全高效地处理各种复杂CSV格式。

内容的提问来源于stack exchange,提问作者Mohammad Sumon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:26:46