VB.NET MVC控制器接收Ajax POST数组仅存首条数据的修复方案
问题:仅能记录数组中的第一条数据,如何修复控制器代码?
看起来你遇到了前端传数组但后端只保存第一条数据的问题,我来帮你分析原因并给出修复方案。
问题背景
你前端通过AJAX传递了包含两个数组的DataDiscount对象:
DataDiscount:{time:["5","8","9"], ind:["%10","%15","%20"]}
但目前后端控制器只能记录第一条数据(5和%10),下面是你的相关代码:
前端JavaScript代码
<script> $(document).on('click', '.Send', function () { var a = []; $(".k_sure").each(function () { a.push($(this).val()); }); var b= []; $(".k_sure").each(function () { // 这里有个笔误!原代码写的是a.push,会导致ind数组和time数组内容重复 b.push($(this).val()); }); var DataDiscount= { time: a, ind: b}; $.ajax({ type: "POST", url: "/admin/pan/discount", data: DataDiscount, traditional: true, dataType: 'html', success: function (c) { }, error: function () { } }); }); </script>
先提个小问题:你前端代码里第二个
each循环不小心把b.push()写成了a.push(),这会导致ind数组和time数组内容完全一样,建议先修正这个笔误,确保两组数据对应正确。
原控制器代码(VB.NET)
Function discount(time As String, ind As String) As String Dim x_add As New Discounts If x_add IsNot Nothing Then x_add.time = time x_add.ind = ind db.Discounts.Add(x_add) db.SaveChanges() Return "Success" Else Return "Err" End If Return "" End Function
问题根源
你的控制器参数是单个字符串类型,但前端传递的是数组。ASP.NET MVC默认会把数组的第一个元素绑定到单个字符串参数上,所以只保存了第一条数据,后面的元素都被忽略了。
修复后的控制器代码
我们需要把参数改成数组类型,然后遍历数组批量添加数据:
Function discount(time As String(), ind As String()) As String ' 先校验数据合法性:数组非空且长度一致 If time Is Nothing OrElse ind Is Nothing OrElse time.Length <> ind.Length Then Return "Err: 数据不匹配或为空" End If ' 遍历数组,为每一组数据创建Discounts实例 For i As Integer = 0 To time.Length - 1 Dim x_add As New Discounts() x_add.time = time(i) x_add.ind = ind(i) db.Discounts.Add(x_add) Next ' 统一保存所有数据,比循环内单独保存更高效 db.SaveChanges() Return "Success" End Function
关键修改点说明:
- 参数类型调整:把
time和ind从String改为String()(字符串数组),这样就能接收前端传递的完整数组。 - 数据校验:添加了数组非空和长度一致的检查,避免出现索引越界或者数据不匹配的错误。
- 批量添加逻辑:通过循环遍历两个数组,为每一组对应的数据创建
Discounts对象并添加到数据库上下文,最后一次性调用SaveChanges(),提升操作性能。 - 前端笔误修正:记得把前端代码里的
a.push改成b.push,确保time和ind数组对应正确的业务数据。
这样修改后,就能把前端传递的所有数组元素都批量保存到数据库中了。
内容的提问来源于stack exchange,提问作者Kuhi
相关产品推荐
相关产品推荐

