Ajax json到MVC5控制器:传递包含集合的对象

伙计们,我在MVC4和MVC5上尝试过这个。

我需要将一个具有一些属性和集合的对象从客户端传递给控制器​​。

我已经在C#中定义了模型:

public enum RequestMode { ReadOnly = 0, Edit = 1} public class DataRequest { public int ProjectId { get; set; } public RequestMode Mode { get; set; } public List PageRequests { get; set; } public DataRequest() { PageRequests = new List(); } } public class PageRequest { public int Id { get; set; } public int PageCurrent { get; set; } public int RowCountPerPage { get; set; } } 

MVC控制器被定义为(仅使用它来设置断点来检查请求值):

 [HttpPost] public JsonResult Test(DataRequest request) { return new JsonResult(); } 

Index.cshtml客户端包含ajax调用:

  var RequestMode = { ReadOnly: 0, Edit: 1 }; var dataRequest = { ProjectId: 17, Mode: RequestMode.Edit, PageRequests: new Array() }; var pageRequest = { TableId: 3165, PageCurrent: 4, RowCountPerPage: 30 }; dataRequest.PageRequests.push(pageRequest); $(document).ready(function () { $.ajax({ data: dataRequest, type: 'POST', cache: false, url: '/Home/Test', success: function (data) { }, fail: function (data) { } }); });  

我开始调试,页面加载,我的断点在控制器测试方法被击中。

在调试器中,请求对象显示为:Mode:Edit PageRequests:Count = 1 ProjectId:17

当我展开PageRequests集合属性时,我看到:{Mvc5WebTest.Controllers.PageRequest} Id:0 PageCurrent:0 RowsPerPage:0

我希望用我设置的值(即3165,4,30)填充PageRequest对象

使用Fiddler,我看到完整的DataRequest对象正在变为正确的Json,但似乎MVC控制器无法将其转回C#对象。

作为一种解决方法,我可以将客户端上的ajax调用修改为var cdr = JSON.stringify(dataRequest);

 $.ajax({ dataType: 'json', type: 'GET', data: { jsonRequest: cdr }, ... 

然后在控制器中

 [HttpGet] public ActionResult Test(string jsonRequest) { var request = JsonConvert.DeserializeObject(jsonRequest); return new JsonResult(); } 

这有效,但我宁愿不将数据作为字符串传递。

任何人都可以了解正在发生的事情以及我需要做些什么来填充这个集合?

因为您要发布JSON数据,所以必须使用JSON.stringify将对象转换为字符串并声明contentType: "application/json; charset=utf-8"

 $(document).ready(function () { $.ajax({ data: JSON.stringify(dataRequest), type: 'POST', contentType: "application/json; charset=utf-8", url: '/Home/Test', success: function (data) { }, fail: function (data) { } }); 

我还注意到在C#代码中,您将PageRequest定义为

 public class PageRequest { public int Id { get; set; } public int PageCurrent { get; set; } public int RowCountPerPage { get; set; } } 

在js中,

 var pageRequest = { TableId: 3165, PageCurrent: 4, RowCountPerPage: 30 }; 

C#中的Id与js中的TableId之间存在冲突。 你将不得不使用其中一个。

您必须指定您正在发送JSON,因为默认内容类型是字符串:

 $(document).ready(function () { $.ajax({ data: dataRequest, type: 'POST', cache: false, contentType: "application/json; charset=utf-8", url: '/Home/Test', success: function (data) { }, fail: function (data) { } });