【问题标题】:jQuery Ajax cannot send List of objects to MVC controllerjQuery Ajax 无法将对象列表发送到 MVC 控制器
【发布时间】:2016-12-10 06:16:20
【问题描述】:

我正在尝试向 MVC 控制器方法发送两个参数,以通过 Ajax 请求将一些信息保存到我的 MS SQL Server 数据库中。我的方法接收一个 int 和一个复杂类型对象的 List。然而,该方法只能接收 int 参数,并为 List 接收 null。

下面是我用来发送 Ajax 请求的 jQuery 脚本,其中包含“ReferenceNo”和“Lots”作为该请求的数据。

jQuery 脚本 (Ajax)

paramReferenceNo = 2;
paramLots = JSON.stringify(paramLots);
$.ajax({
  contentType: 'application/json; charset=utf-8',
  dataType: 'json',
  type: 'POST',
  url: serverpath + '/Home/Save_Lots',
  data: "{'paramReferenceNo':'" + paramReferenceNo + "', 'paramLots':'" + paramLots + "'}",
  success: function (data) {
    alert('Saved!');
  }
});

以下是将数据保存到 SQL Server 的 MVC 方法。在调试器模式下,当 Ajax 请求被触发时,我可以从断点看到 paramReferenceNo' 获取 int 2 但 'paramLots' 变为 null (Count= 0)。

Save_Lot(MVC_Controller 方法)

public void Save_Lots(int paramReferenceNo, List<SalesProd_Lots> paramLots) {
  using (SalesProdDBContext CDC = new SalesProdDBContext()) {
    // Logic to save to database here....
  }
}

请求返回 200 -OK 的响应。下面是取自 IE 网络调试器的“请求正文”。

请求正文

{'paramReferenceNo':'2', 'paramLots':'[{"ReferenceNo":1,"LotNo":"CC-1889","isActive":true},{"ReferenceNo":1,"LotNo":"CD-1891","isActive":true},{"ReferenceNo":1,"LotNo":"CE-1892","isActive":true}]'}

我在 SO 上一直在寻找类似的问题,但找不到适合我的解决方案。

提前致谢。

【问题讨论】:

  • 您正在传递字符串 paramLots = JSON.stringify(paramLots); 并尝试以 List 的身份访问它
  • 删除paramLots = JSON.stringify(paramLots);并使用data: JSON.stringify({ paramReferenceNo: paramReferenceNo, paramLots: paramLots }),
  • @StephenMuecke 谢谢伙计,你的解决方案做到了。介意发表您的评论作为答案,以便我接受吗?
  • Darin Dimitrov 添加了一个答案,表明(视图模型并非完全必要,但也是一个好主意)

标签: jquery sql-server ajax asp.net-mvc-4


【解决方案1】:

首先编写一个封装所需参数的视图模型:

public class MyViewModel
{
    public int ParamReferenceNo { get; set; }

    public List<SalesProd_Lots> ParamLots { get; set; }
}

您的控制器操作将作为参数:

public void Save_Lots(MyViewModel viewModel)
{
    ...
}

然后在客户端:

paramReferenceNo = 2;
lots = paramLots; // this could be a complex object

$.ajax({
    contentType: 'application/json; charset=utf-8',
    type: 'POST',
    url: serverpath + '/Home/Save_Lots',
    data: JSON.stringify({
        paramReferenceNo: paramReferenceNo,
        paramLots: lots
    },
    success: function (data) {
        alert('Saved!');
    }
});

【讨论】:

  • 不幸的是,应用程序的设计不适合视图模型。我决定使用原始设计并暂时取消视图模型。尽管即使使用我目前拥有的两个参数 MVC 方法,您的客户端脚本解决方案似乎也能很好地解决我的问题。谢谢。
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
相关资源
最近更新 更多