首页 > 解决方案 > 嵌套对象未与服务器端模型映射

问题描述

我试图通过 AJAX 将嵌套对象发送到我的 mvc 控制器。我的数据集如下。

   function GetValuesForSave() {

        var model = {
            Partycode: "x",
            DocDate: new Date(),
            DocNo: 1,
            SaleItems: {
                StockCode:'',
                Amount: 1,
                DiscPerc: 1,
                DiscAmount: 1,
                Qty: 1,
                Rate: 1,
                Description: '',
                Unit: ''
            }

        }

        return model;
    }

我的阿贾克斯电话:

var datatosend=GetValuesForSave();
    $.ajax({
      url: "/Sales/SaveSales/",

      data: datatosend,
      success: function() {
        alert("success");
      },
      error: function() {
        alert("failure");
      }
    });

我的模型结构:

public class SalesViewModel
{
    public string Partycode { get; set; }
    public DateTime DocDate { get; set; }
    public int DocNo { get; set; }
    private SaleItem _saleItem;
    public SaleItem SaleItems { get; set; }
}

public class SaleItem
{
    public string StockCode { get; set; }
    public string Description { get; set; }
    public string Unit { get; set; }
    public double Qty { get; set; }
    public double Rate { get; set; }
    public double DiscPerc { get; set; }
    public double DiscAmount { get; set; }
    public double Amount { get; set; }
}

我的控制器方法:

public ActionResult SaveSales(SalesViewModel m)
{
    var data = sale;
    return View();
}

我面临的问题是能够从控制器获取主要模型详细信息,但是嵌套对象字段为空,我是否缺少某些内容。我是否需要对嵌套属性的 GET SET 做任何事情。我尝试将数据作为 JSON 字符串发送仍然得到相同的结果。 在此处输入图像描述

请找到 chrome 控制台日志

在此处输入图像描述

标签: c#ajaxasp.net-mvcmodel

解决方案


您当前正在执行 GET 请求。因为这个jQuery的ajax方法试图解释data为一个查询字符串,这就是为什么你只能在你的控制器方法中获得“顶级”键值对。

为了让它工作,你需要修改你的ajax调用:

$.ajax({
  type: "POST", // perform POST request
  url: "/Sales/SaveSales/",
  data: JSON.stringify(datatosend), // serialize your data into JSON
  contentType: "application/json", // tell server to interpret data as JSOn
  success: function() {
    alert("success");
  },
  error: function() {
    alert("failure");
  }
});

在您的控制器中,您还必须指定m应该从 POST 请求的正文中获取,方法是将您的端点标记为HttpPost并使用标签注释您的参数FromBody

[HttpPost]
public ActionResult SaveSales([FromBody] SalesViewModel m)
{
    // ...
}

推荐阅读