将查询字符串参数 + ID 列表作为 POST 传递给 MVC 控制器

Pass querystring parameter + list of ids as POST to MVC Controller

提问人:BrianLegg 提问时间:10/22/2023 更新时间:10/23/2023 访问量:39

问:

我正在尝试将 id(长)加上 id(数组)列表传递给控制器操作。我最好的运气是让 id 通过,但我从未让数组发布过。

我今天至少浏览了 10 篇堆栈溢出文章,试图让它发挥作用。我确定我错过了一些小东西,但我不确定是什么。

Javascript 和 AJAX:

        HandleCardReordering: function () {
            var ids = new Array();
            for (var i = 0; i < $(".CourseSectionId").length; i++) {
                ids[i] = $(".CourseSectionId:eq(" + i + ")").val();
            }
            var courseId = $("#CourseId").val();
            
            $.ajax({
                url: "/Content/CourseContent/ReorderCourseSections?courseId=" + courseId + "&sectionIds=" + JSON.stringify(ids),
                cache: false,
                type: "POST",
                dataType: 'json',
                contentType: "application/json",
                traditional: true,
                success: function (result) {
                    //
                }
            });
        },

ids 集合和 courseId 是有效的,我用 console.log 检查了它们,它们看起来不错。

我的控制器方法:

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

我可以通过查询字符串参数获取要填充的 courseId,但 sectionIds 始终是一个长度为 0 的数组。我尝试添加 traditional: true,尝试字符串化我的 ids 集合,我将 [FromQuery] 添加到我的 sectionIds 参数中。没有一个奏效。感谢您的观看。

javascript jquery ajax asp.net-mvc-5

评论

1赞 freedomn-m 10/23/2023
参数名称和类型需要匹配。你以字符串形式传递 - MVC 不知道你希望自动解析它,而默认模型绑定器不知道如何为你转换它。你有选择:1)添加一个模型活页夹,将json转换为int数组,2)将你的参数更改为字符串(首先这样做),并在操作中自己解析它,3)改变你传递sectionIds的格式(即不是作为JSON字符串)sectionIds
0赞 BrianLegg 10/23/2023
我最终使用了你的 #2 建议,这很有效。如果您能以答案的形式发表您的评论,我会接受。谢谢。
0赞 freedomn-m 10/23/2023
这只是让它工作的第一关。请参阅此文章还有这个关于如何添加自定义模型活页夹的 SO 问题。

答:

0赞 Negi Rox 10/23/2023 #1

可能的解决方案:

1. 第一种方法:

1- 将参数类型从 long[] 更改为 string。 2- 你现在会得到一个字符串,解析它并在控制器中将其转换为 long[]。

public ActionResult Multiple(string sectionIds){
  long[] idsArray = sectionIds.Split(',').Select(long.Parse).ToArray();
  
}

第二种方法:

1- 更改您的 queryparamter,如下例所示

?sectionIds=24041&sectionIds=24117

无需更改控制器。在。Netcore它会起作用。

http://localhost:5434/MukeshNProject/MultipleIds?ids=24041&ids=24117
public ActionResult MultipleIds([FromQuery] int[] ids)
{
}