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

Arj*_* H. 5 asp.net-mvc jquery json asp.net-mvc-5

伙计们,我在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<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; }
}
Run Code Online (Sandbox Code Playgroud)

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

[HttpPost]
public JsonResult Test(DataRequest request)
{
    return new JsonResult();
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

$.ajax({
    dataType: 'json',
    type: 'GET',
    data: { jsonRequest: cdr },
    ...
Run Code Online (Sandbox Code Playgroud)

然后在控制器中

[HttpGet]
public ActionResult Test(string jsonRequest)
{
    var request = JsonConvert.DeserializeObject<DataRequest>(jsonRequest);
    return new JsonResult();
}
Run Code Online (Sandbox Code Playgroud)

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

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

vbn*_*vbn 8

因为您要发布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) {

        }
});
Run Code Online (Sandbox Code Playgroud)

我还注意到在C#代码中,你定义PageRequest

public class PageRequest
{
    public int Id { get; set; }
    public int PageCurrent { get; set; }
    public int RowCountPerPage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在js中,

var pageRequest = { TableId: 3165, PageCurrent: 4, RowCountPerPage: 30 };
Run Code Online (Sandbox Code Playgroud)

IdC#和TableIdjs 之间存在冲突.你必须使用其中一个.