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

时间:2014-03-20 17:28:10

标签: jquery asp.net-mvc 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; }
}

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

[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>

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

在调试器中,请求对象显示为:     模式:编辑     PageRequests:Count = 1     ProjectId:17

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

我希望PageIquest对象能够填充我设置的值(即3165,4,30)

使用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<DataRequest>(jsonRequest);
    return new JsonResult();
}

这样可行,但我不希望将数据作为字符串传递。

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

2 个答案:

答案 0 :(得分: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) {

        }
});

我还注意到在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之间存在冲突。你必须使用其中一个。

答案 1 :(得分:-1)

您必须指定您正在发送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) {

        }
    });