提交JSON元素列表到MVC 5控制器导致空指针异常



后端我有一个这样的控制器:

public class MixSearch
{
    public int quantity { get; set; }
    public int um { get; set; }
    public string search { get; set; }
}
public class JsonPostMixSearch
{
    public int index { get; set; }
    public MixSearch[] elems { get; set; }
}
public class MixController : Controller
{
    ApplicationDbContext db = new ApplicationDbContext();
    [HttpPost]
    public ActionResult Best(JsonPostMixSearch mixsearch)
    {
        List<Mix> mixes = new List<Mix>();
        Mix lowest = new Mix { Products = new List<Product>(), Total = 0 };
        mixes.Add(lowest);
        List<List<Product>> matrix = new List<List<Product>>();
        foreach (var product in mixsearch.elems)
        {
            List<Product> products = new List<Product>();
            foreach (var term in product.search.Split(' '))
            {
                var query = db.Products.Where(p => p.Description.Contains(term)).OrderBy(p => p.Price/p.Quantity).Take(4).ToList();
                products.AddRange(query);
                lowest.Products.Add(query.First());
                lowest.Total += query.First().Price * product.quantity;
            }
            matrix.Add(products);
        }
        return View(mixes);
    }
}
我使用jquery从之前添加的元素中创建适当的数据:
    $("#calcolamix").click(function (e) {
        var mix = new Object();
        $(".productsearch").each(function (index) {
            var input = $(this);
            mix[index] = { quantity: input.data("quantity"), um: input.data("um"), search: input.data("search") }
        });
        $.ajax({
            url: "@Url.Action("Best","Mix")",
            type: "POST",
            data: JSON.stringify(mix),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            error: function (response) {
                $("#mixresult").html(response.responseText);
            },
            success: function (response) {
                $("#mixresult").html(response);
            }
        });
    });

请求有效负载如下

{0: {quantity: 1, um: 1, search: "acqua"}}

现在,我尝试了许多不同的组合,但仍然得到"对象引用未设置为对象的实例",在以下行

    foreach (var product in mixsearch.elems)

很明显,控制器没有正确地反序列化有效负载,问题是无法理解如何使用jquery和JSON提交对象列表。

有人能解释一下吗?

反序列化不起作用,因为ASP中的模型绑定器。. NET MVC不能将传入的数据映射到JsonPostMixSearch类型。您应该在mix对象中创建一个名为elems的数组,并将元素添加到该数组中。此外,您还应该在mix上设置index属性:

var mix = {};
mix.elems = [];
$(".productsearch").each(function (i) {
        var input = $(this);
        mix.index = i;
        mix.elems[i] = { quantity: input.data("quantity"), um: input.data("um"), search: input.data("search") }
    });

最新更新