在项目上多多少少都会有些地方会使用到批量增删改的地方,删除可以通过ID获取到每一条数据然后拼接起来传递到控制器,然后在控制器里分割字符串,进行foreach循环删除,新增需要通过for循环获取到数据,但是也不能每获取到一条数据就传参一次数据,所以我把for循环获取到的数据封装到一个数组里面,然后通过数组传递给后台控制器,数组的传参我试过了多种方法:一、jquery.form插件里的ajaxSbumit提交,二、ajax异步请求提交,三、直接post请求提交。三种方法我都尝试过了,最终得到的结果是ajaxSbumit提交是不能把数组传递过去的,获取到数组,控制器也是为null,ajax异步请求提交和直接post请求提交这两种方法是可行的
Javascript循环获取数据把获取的数据添加到数组里的代码:
var PurchaseDetailArray= new Array();//申明一个数组
var tr = $("#tabDetail").find("tr");
//循环获取表格中的信息
for (var i = 1; i < tr.length - 1; i++) {
//获取采购订单配件明细的信息
var PartsID = $("#PartsID" + i).val();//获取配件ID
var VehicleTypeID = $("#VehicleTypeID" + i).val();//获取车型ID
var Quantity = $("#Quantity" + i).val();//获取数量
var Discount = $("#Discount" + i).val();//获取折扣
var Money = $("#Money" + i).val();//获取金额
var ActualQuantity = $("#ActualQuantity" + i).val();//获取实收数量
var ArrayDetail = new Object();//申明一个对象
ArrayDetail = { PartsID:PartsID, VehicleTypeID: VehicleTypeID, Quantity: Quantity, Discount: Discount,
Money: Money, ActualQuantity: ActualQuantity };//对象赋值
PurchaseDetailArray.push(ArrayDetail); //使用push()方法想数组里添加对象
}
因为表格中有表头行,索引是从零开始,所以i从1开始,不循环表头行;循环长度i <
tr.length – 1是因为表格里最后一行是计算总值,最后一行也不需要循环,所以循环长度为获取到的表格长度-1减去最后一行
方式一:ajax异步请求提交
Javascript代码:
$.ajax({
url: '@Url.Action("savePurchasrOrder")',
data: { "PurchaseDetailArray ":PurchaseDetailArray },//数组
// data: ArrayDatil, //对象
dataType: "json",
type: "POST",
//traditional: true,
success: function (returnJson) {
if (returnJson.State) {
layer.confirm(returnJson.Text + '\n' + "是否立即审核该采购订单?\n点击<确定>--该订单会立即生效" + '\n' + "点击<取消>--只保存当前单据但不生效,只有审核后,该单据才会生效"
+ '\n' + "\n现在未审核,下次打开未审核的单据时,您可以进行审核!", { icon: 3, title: "提示" }, function () {
Audit();//调用审核的方法
});
}
else {
layer.alert(returnJson.Text, { icon: 0, title: "提示" });
}
}
});
ajax请求提交是异步请求,传递的data可以为数组也可以为对象,我传递的是数组
方法二、直接post请求提交
Javascript代码:
$.post("/ProcurementAndSales/PurchaseOrder/savePurchasrOrder",
{
PurchaseDetailArray:PurchaseDetailArray,
}, function (returnJson) {
layer.close(layIndex);
if (returnJson.State) {
layer.confirm(returnJson.Text + '\n' + "是否立即审核该采购订单?\n点击<确定>--该订单会立即生效" + '\n' + "点击<取消>--只保存当前单据但不生效,只有审核后,该单据才会生效"
+ '\n' + "\n现在未审核,下次打开未审核的单据时,您可以进行审核!", { icon: 3, title: "提示" }, function () {
Audit();//调用审核的方法
});
}
else {
layer.alert(returnJson.Text, { icon: 0, title: "提示" });
}
});
因为ajax异步请求的请求类型也是post,所以直接使用post请求提交也是可以把数组传递过去的
控制器Controller代码:
因为代码有点长,所以这里只给出循环保存数组的代码
public ActionResult savePurchasrOrder(SYS_PurchaseDetail sysPurchaseDetail, List<SYS_PurchaseDetail> PurchaseDetailArray)
这里接受数组是要List一个表接收的这个表是你存放数组里的数据的表
//foreach循环保存数组里的数据
foreach (var ArrayData in PurchaseDetailArray)
{
//查询刚刚新增的采购订单的主键ID,新增的ID肯定在最后一条数据
var selPurchasrOrderID= (from tbPurcharsOrder in myModels.PW_PurchaseOrder select new
{
PurchaseOrderID = tbPurcharsOrder.PurchaseOrderID,
}).ToList();
int listID = selPurchasrOrderID.LastOrDefault().PurchaseOrderID;
sysPurchaseDetail.PurchaseOrderID = listID;//查出来的主键ID,赋值到明细的外键
//把数组里的数据赋值添加到表中的字段
sysPurchaseDetail.PartsID = ArrayData.PartsID;
sysPurchaseDetail.VehicleTypeID = ArrayData.VehicleTypeID;
sysPurchaseDetail.Quantity = ArrayData.Quantity;
sysPurchaseDetail.Discount = ArrayData.Discount;
sysPurchaseDetail.Money = ArrayData.Money;
sysPurchaseDetail.ActualQuantity = ArrayData.ActualQuantity;
myModels.SYS_PurchaseDetail.Add(sysPurchaseDetail);
myModels.SaveChanges();
}
jquery.form插件里的ajaxSbumit提交是不可行的,所以代码就不列举出来了