jquery - Ajax json 到 MVC5 Controller : Passing object containing a collection

标签 jquery asp.net-mvc json asp.net-mvc-5

各位,我已经在 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/

相关文章:

javascript - jQuery val() 比较

javascript - 在 ember js 和 mvc 中使用验证码

asp.net-mvc - 如何将 IIS 中的默认页面设置为 Controller ?

javascript - 使用嵌套对象创建复杂形式的 JSON 表示并更新 Backbone 模型

javascript - 将 VisualBasic 表达式动态转换为 JavaScript 表达式

Javascript - 在文本框中的数字后插入空格

php - 强制 JavaScript 按所需顺序执行

javascript - 不想只在 moment.js 中显示当前年份的年份

c# - 在数据库中存储大文件会导致类型为 'System.OutOfMemoryException' 的异常

java - 从 JSON 数组中提取值