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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:50:26