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

MVC控制器POST请求中数组参数无法接收问题求助

解决MVC POST请求中数组参数绑定失败的问题

问题根源

你当前的代码存在两个核心问题:

  1. 把数组用JSON.stringify转成字符串拼在URL里,MVC的[FromQuery]无法直接将JSON格式的字符串解析为long[]类型;
  2. 设置了contentType: "application/json"但未在data中传递JSON数据,导致请求体为空,同时traditional: true的配置没有发挥作用(它是针对传统key=value&key=value格式的数组传递)。

可行解决方案

方案一:用传统表单格式传递参数(简单直接)

修改JS代码,直接在data中传递参数对象,利用traditional: true让jQuery生成MVC能识别的数组格式:

HandleCardReordering: function () {
    var ids = [];
    // 简化数组获取逻辑
    $(".CourseSectionId").each(function() {
        ids.push($(this).val());
    });
    var courseId = $("#CourseId").val();
    
    $.ajax({
        url: "/Content/CourseContent/ReorderCourseSections",
        cache: false,
        type: "POST",
        dataType: 'json',
        traditional: true,
        // 直接传递参数对象,无需手动拼URL
        data: {
            courseId: courseId,
            sectionIds: ids
        },
        success: function (result) {
            // 处理成功逻辑
        }
    });
}

修改控制器方法,去掉[FromQuery]特性(POST请求默认从表单数据绑定参数):

[HttpPost]
public async Task<JsonResult> ReorderCourseSections(long courseId, long[] sectionIds, CancellationToken cancellationToken)
{
    return Json(new { success = "true" });
}

方案二:用JSON请求体传递参数(适合复杂场景)

如果需要传递更复杂的参数结构,可以用JSON请求体的方式:
首先创建一个接收参数的模型类:

public class ReorderCourseSectionsRequest
{
    public long CourseId { get; set; }
    public long[] SectionIds { get; set; }
}

修改JS代码,将参数序列化为JSON字符串放在data中:

HandleCardReordering: function () {
    var ids = [];
    $(".CourseSectionId").each(function() {
        // 转换为数字类型,确保JSON序列化后是long格式
        ids.push(Number($(this).val()));
    });
    var courseId = Number($("#CourseId").val());
    
    $.ajax({
        url: "/Content/CourseContent/ReorderCourseSections",
        cache: false,
        type: "POST",
        dataType: 'json',
        contentType: "application/json",
        // 序列化整个参数对象为JSON
        data: JSON.stringify({
            CourseId: courseId,
            SectionIds: ids
        }),
        success: function (result) {
            // 处理成功逻辑
        }
    });
}

修改控制器方法,用[FromBody]特性绑定JSON请求体:

[HttpPost]
public async Task<JsonResult> ReorderCourseSections([FromBody] ReorderCourseSectionsRequest request, CancellationToken cancellationToken)
{
    // 使用request.CourseId和request.SectionIds
    return Json(new { success = "true" });
}

关键注意点

  • 确保获取的ID值是数字类型:val()方法返回的是字符串,转换为数字后才能正确绑定到long类型参数;
  • 不要混合URL拼接参数和JSON请求体:要么全部用URL/表单参数,要么全部用JSON请求体,避免绑定冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:15:19