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); }
关键修改点说明
- 创建独立对象实例:把
uploadModelRecord的声明移到foreach循环内部,确保每一行数据都对应一个全新的对象,避免后续赋值覆盖之前的行数据。 - 收集所有行数据:每次解析完一行后,将新对象添加到
uploadModelList中,让列表保存所有行的解析结果。 - 返回完整数组:最后返回
uploadModelList,接口就会输出包含所有行数据的JSON数组,而不是单个对象。 - 增加安全判断:访问数组索引前先判断长度,避免因CSV行格式异常导致的程序崩溃。
额外建议
你当前手动处理CSV的方式(替换逗号为空格再分割)有潜在风险,如果CSV字段本身包含空格(比如ParentName是John Doe),这种处理会把字段拆成两部分导致数据错误。建议使用成熟的CSV解析库(比如CsvHelper),它能更安全高效地处理各种复杂CSV格式。
内容的提问来源于stack exchange,提问作者Mohammad Sumon
相关产品推荐
相关产品推荐

