ASP.NET Core控制器中将字符串格式数组转为实际数组的方法
解决ASP.NET Core表单提交二维数组无法正确绑定的问题
前端修正提交方式(推荐)
当前问题核心是前端把二维数组转成JSON字符串塞进表单input,再序列化整个表单后又转一次JSON,导致后端拿到的是经过两次序列化的字符串,无法直接绑定到数组类型。可按以下方式调整:
方式1:使用JSON格式直接提交(后端用[FromBody]接收)
修改前端代码,直接构建包含数组的JSON对象,跳过表单序列化步骤:
// 构建提交数据对象,包含表单其他字段和二维数组 var submitData = { // 示例:手动获取其他表单字段 // TrainingName: $("#trainingName").val(), ParsedQuestions: questionsArr // 直接传入二维数组,无需JSON.stringify }; $.ajax({ type: "POST", url: '@Url.Action("SaveTraining", "Training")', contentType: "application/json", // 必须指定内容类型为JSON data: JSON.stringify(submitData), error: function(jqXHR, textStatus, errorMessage) { console.log(errorMessage); }, success: function(data) {console.log(data)} });
后端控制器调整接收方式,用[FromBody]替代[FromForm]:
public async Task<IActionResult> SaveTraining([FromBody] KII_TrainingModel formData) { // 此时formData.ParsedQuestions会直接绑定为string[][]或List<List<string>>类型 }
方式2:保持表单提交,正确传递数组
若必须用表单提交(保留[FromForm]),无需将数组转成JSON字符串,而是通过多个同名字段传递数组元素:
var formData = new FormData($("#trainingForm")[0]); // 移除原表单中存储JSON字符串的ParsedQuestions字段 formData.delete("ParsedQuestions"); // 遍历二维数组,按索引格式添加到FormData questionsArr.forEach((row, rowIndex) => { row.forEach((item, colIndex) => { formData.append(`ParsedQuestions[${rowIndex}][${colIndex}]`, item); }); }); $.ajax({ type: "POST", url: '@Url.Action("SaveTraining", "Training")', data: formData, processData: false, // 禁止自动处理FormData contentType: false, // 让浏览器自动设置正确的Content-Type error: function(jqXHR, textStatus, errorMessage) { console.log(errorMessage); }, success: function(data) {console.log(data)} });
后端模型的ParsedQuestions属性保持string[][]或List<List<string>>类型,控制器依然用[FromForm]即可自动绑定。
后端处理已接收的字符串(应急方案)
若暂时无法修改前端代码,可在后端把接收的JSON字符串反序列化为数组:
使用System.Text.Json(.NET Core 3.0+内置)
using System.Text.Json; public async Task<IActionResult> SaveTraining([FromForm] KII_TrainingModel formData) { // 先将模型中ParsedQuestions改为string类型接收前端传递的JSON字符串 string jsonStr = formData.ParsedQuestions; // 反序列化为二维数组 string[][] parsedQuestions = JsonSerializer.Deserialize<string[][]>(jsonStr); // 或反序列化为List<List<string>> List<List<string>> parsedQuestionsList = JsonSerializer.Deserialize<List<List<string>>>(jsonStr); // 后续业务逻辑处理 }
使用Newtonsoft.Json(需安装NuGet包)
若项目依赖Newtonsoft.Json,代码如下:
using Newtonsoft.Json; public async Task<IActionResult> SaveTraining([FromForm] KII_TrainingModel formData) { string jsonStr = formData.ParsedQuestions; string[][] parsedQuestions = JsonConvert.DeserializeObject<string[][]>(jsonStr); // 或List<List<string>> List<List<string>> parsedQuestionsList = JsonConvert.DeserializeObject<List<List<string>>>(jsonStr); }
内容的提问来源于stack exchange,提问作者Sophie
相关产品推荐
相关产品推荐

