我是一个全新的ASP.NET核心,我正在尝试实现一个库存控制系统。现在我面临着一个将销售数据保存到数据库的问题。主要问题是我无法将数据导入控制器。我在数据库中有“sales”、“SalesProducts”和“products”表。到目前为止,我所尝试的是,
Sales Create View有一个下拉列表,用于选择产品,并使用SalesViewModel填充:
销售视图模型
public class SalesViewModel
{
public Sale Sale { get; set; }
public List<SelectListItem> Products { get; set; }
}
要创建销售项目列表,每次用户选择产品及其数量时,都会创建'subArray',并将该项目数组推送到'SalesItemArray',
$('.btn-sales-add').on('click', function () {
let subArray = [];
let productId = $('#product-id').val();
let productName = $('#product-id option:selected').text();
let price = $('#sales-price').val();
let quanity = $('#sales-quantity').val();
let subTotal = $('#sales-sub-total').val();
quanity = parseInt(quanity);
subTotal = parseFloat(subTotal);
total += subTotal;
$('#sales-total input').val(total);
subArray.push(productId);
subArray.push(productName);
subArray.push(price);
subArray.push(quanity);
subArray.push(subTotal);
salesItemsArray.push(subArray);
});
数组格式
[[pro_id, pro_name, quantity, subTotal],[pro_id, pro_name, quantity, subTotal]]
为了将销售数据和销售项导入控制器,我使用了FormData对象和另一个FormDataViewModel,如this solution所示
销售表单数据视图模型
public class SalesFormDataViewModel
{
public string StoreId { get; set; }
public string Total { get; set; }
public string[] SalesItemList { get; set; }
}
我将SalesViewModel传递给视图并将SalesFormDataViewModel传递给控制器,
let storeId = $("#sales-store-id").val();
let total = $("#sales-total input").val();
let salesItemList = salesItemsArray;var
formData = new FormData();
formData.append("StoreId", storeId);
formData.append("Total", total);
formData.append("salesItemList", salesItemList);
$.ajax({
url: '/api/sales/createSales',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify(formData),
success: function (response) {
alert('success');
},
error: function (response, error) {
alert('error');
}
});
控制器
[HttpPost]
[Route("createSales")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> createSales(SalesFormDataViewModel
salesFormDataViewModel)
{
return Ok(new { success = "Stock updated successfully" });
}
事实上,我已经尝试了几乎所有的解决方案搜索网络,但无论尝试,每次我得到相同的错误响应。我甚至不能达到断点在controler,因为 AJAX 抛出异常。Ajax Response
拜托,我期待你们的帮助。谢谢。
我正在编辑此问题以添加更多详细信息。在尝试Chens解决方案后,现在获得this error
2条答案
按热度按时间crcmnpdw1#
我不能传递数组,直到我改变了我的viewModel。我必须删除字符串数组类型为字符串类型。
然后,在将数组转换为json字符串之后,我将数组追加到formData。
在搜索了如何将formData发送到控制器之后,在通过 AJAX 直接发送formData对象之前,我必须执行以下操作。
然后 AJAX 叫:
通过这种方式,我可以将二维js数组从视图传递到控制器。但是,由于接收到的SalesItemList数组是一个JSON数组,因此无法保存传递的对象保存到数据库。在尝试将该数组反序列化为销售控制器中的对象时,会引发异常无法反序列化当前JSON数组。因此,不是传递数组的数组,而是传递对象的数组。同上解决了问题。
我张贴这个答案,以为它会帮助那些谁面临同样的问题,并希望强调,我结束了这个解决方案感谢那些谁回答这个问题。
dly7yett2#
400响应是由于您没有传递
ValidateAntiForgeryToken
。在使用 AJAX 创建POST请求时,很容易忘记防伪造令牌。如果您在请求中省略了该值,服务器将返回400错误请求结果。请检查您是否传递了正确的令牌。方法一:
手动添加标题:
有关详细信息,请参阅此链接。
方法二:
注解掉验证防伪令牌:
编辑:
让我们一步一步地解决您的错误:
查看方式:
假设你得到的
formData
是正确的,它应该是这样的(注意 AJAX 的几个属性):控制器: