各位,我已经在 MVC4 和 MVC5 上尝试过了。
我需要将一个具有一些属性的对象和一个集合从客户端传递到 Controller 。
我在 C# 中将模型定义为:
public enum RequestMode { ReadOnly = 0, Edit = 1}
public class DataRequest
{
public int ProjectId { get; set; }
public RequestMode Mode { get; set; }
public List<PageRequest> PageRequests { get; set; }
public DataRequest()
{
PageRequests = new List<PageRequest>();
}
}
public class PageRequest
{
public int Id { get; set; }
public int PageCurrent { get; set; }
public int RowCountPerPage { get; set; }
}
MVC Controller 定义为(仅使用它设置断点来检查请求值):
[HttpPost]
public JsonResult Test(DataRequest request)
{
return new JsonResult();
}
Index.cshtml 客户端包含 ajax 调用:
<script type="text/javascript">
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) {
}
});
});
</script>
我开始调试,页面加载, Controller 测试方法中的断点被命中。
在调试器中,请求对象显示为: 模式:编辑 页面请求:计数 = 1 项目编号:17
当我展开 PageRequests 集合属性时,我看到: {Mvc5WebTest.Controllers.PageRequest} 编号:0 当前页数: 0 每页行数:0
我希望 PageRequest 对象填充我设置的值(即 3165、4、30)
使用 Fiddler,我看到完整的 DataRequest 对象已正确转换为 Json,但 MVC Controller 似乎无法将其转换回 C# 对象。
作为解决方法,我可以将客户端上的 ajax 调用修改为 var cdr = JSON.stringify(dataRequest);
$.ajax({
dataType: 'json',
type: 'GET',
data: { jsonRequest: cdr },
...
然后在 Controller 中
[HttpGet]
public ActionResult Test(string jsonRequest)
{
var request = JsonConvert.DeserializeObject<DataRequest>(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
存在冲突。您必须使用其中之一。
关于jquery - Ajax json 到 MVC5 Controller : Passing object containing a collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22540739/