嵌套对象未与服务器端模型映射

时间:2019-07-07 13:03:41

标签: c# ajax asp.net-mvc model

我正在尝试通过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;
    }

我的Ajax呼叫:

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();
}

面临的问题是能够从控制器中获取主要模型的详细信息,但是如果缺少某些对象,则嵌套对象字段为null。 我是否需要使用嵌套属性的GET SET做任何事情。我尝试将数据作为JSON字符串发送仍然得到相同的结果。 enter image description here

请找到Chrome控制台日志

enter image description here

2 个答案:

答案 0 :(得分:2)

您当前正在执行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标签注释参数:< / p>

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

答案 1 :(得分:1)

将动作动词指定为[HttpPost] public ActionResult SaveSales(SalesViewModel m) { ... }

$.ajax({
    url: "/Home/SaveSales/",
    type: "POST",
    ...
}

和您的API调用:

apply

enter image description here