首页 > 解决方案 > ASP.NET Core - AJAX 数组看起来没有填充并传递给控制器

问题描述

我在使用 AJAX 将数组传递给控制器​​时遇到问题。

下面是SQL表结构截图:

这是SQL表结构

这是视图

$("body").on("click", "#btnSave", function () {

            var items = new Array();
            $("#tblItems TBODY TR").each(function () {
                var row = $(this);
                var item = {};
                item.ItemID = row.find("TD").eq(0).html();
                item.ProInvoiceNum = row.find("TD").eq(1).html();
                item.InvoiceNum = row.find("TD").eq(2).html();
                item.ProductNum = row.find("TD").eq(3).html();
                item.ItemDiscount = row.find("TD").eq(4).html();
                item.ItemAmount = row.find("TD").eq(5).html();
                items.push(item);
            });

            $.ajax({
                type: "POST",
                url: "/Items/AddItems",
                data: JSON.stringify(items),
                traditional: true,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (r) {
                    alert(r + " record(s) inserted.");
                }
            });
        });

当我想保存 JSON 数组结果时,控制器返回 0 条记录已添加到 DB。

例如“ItemId”是否应该被解析,因为它是 int 类型并且它是数组中的字符串,对吗?

这是控制器中的帖子操作

        [HttpPost]
        public IActionResult AddItems([FromBody]IEnumerable<Items> items)
        {
                //Loop and insert records.
                foreach (Items item in items)
                {
                    _context.Items.Add(item);
                }

                int insertedRecords = _context.SaveChanges();
                return Json(insertedRecords);     
        }

我非常感谢对此的任何帮助,我尝试以多种方式解决此问题,但现在我的大脑被解决此问题的可能想法所阻塞。

如果您需要更多详细信息,请告诉我。

标签: javascriptjqueryarraysasp.net-core

解决方案


我认为问题在于您的某些属性不是字符串类型,因此在模型绑定时没有正确设置它们。

我会命名类项目而不是项目,因为这是实体框架使用的约定。查看您的表结构,您的项目类应该被定义为这样的

public class Item
{
    public int ItemID { get; set; }
    public string ProInvoiceNum { get; set; }
    public string InvoiceNum { get; set; }
    public string ProductNum { get; set; }
    public byte ItemDiscount { get; set; }
    public int ItemAmount { get; set; }
}

您遇到的问题是模型绑定器发送的 JSON 包含字符串和带有一些整数的模型。我认为最简单的解决方案是在客户端使用 parsInt 方法。换句话说,将您的项目填充行更改为此

item.ItemID = parseInt(row.find("TD").eq(0).html());
item.ProInvoiceNum = row.find("TD").eq(1).html();
item.InvoiceNum = row.find("TD").eq(2).html();
item.ProductNum = row.find("TD").eq(3).html();
item.ItemDiscount = parseInt(row.find("TD").eq(4).html());
item.ItemAmount = parseInt(row.find("TD").eq(5).html());

然后你的 JSON 将在它需要的地方包含数字而不是字符串。


推荐阅读