在mvc控制器中收到的Javascript对象为null

时间:2014-08-25 17:48:59

标签: javascript ajax asp.net-mvc json controller

下面是我的AJAX GET请求,它试图将一些参数(包括javascript对象)传递给mvc控制器,但该对象始终作为null接收:

 var sort =  { column: 'UserName', order: 'desc' };
 var sortParameter = JSON.stringify(sort);

 $.ajax({
       url: '@Url.Action("GetUsers", "Account")',
       cache: false,
       type: 'GET',
       contentType: 'application/json; charset=utf-8',
       data: { skipRecords: vm.pageIndex * 1000, sortParam: sortParameter },
       success: function (data) {
       }
 });

控制器方法如下所示:

[HttpGet]
public JsonResult GetUsers(int skipRecords, Sort sortParam, string userName = null)
{

}

以下是定义的排序类:

public class Sort
{
    public string column { get; set; }
    public string order { get; set; }
}

如果我不使用JSON.stringify并仅传递javascript对象,则下面是发送的请求:

GET /Account/GetUsers?skipRecords=0&sortParam%5Bcolumn%5D=UserName&sortParam%5Border%5D=desc&_=1408990051727 HTTP/1.1

2 个答案:

答案 0 :(得分:3)

你可能正在寻找:

 var sortParameter =  { column: 'UserName', order: 'desc' };

 $.ajax({
       url: '@Url.Action("GetUsers", "Account")',
       cache: false,
       type: 'POST',
       contentType: 'application/json; charset=utf-8',
       data: JSON.stringify({ 
         skipRecords: vm.pageIndex * 1000, 
         sortParam: sortParameter }),
       success: function (data) {
       }
 });

您的代码不起作用的原因是因为如果您没有JSON.stringify整个结果,它将作为查询字符串编码传递。您不能将JSON作为查询字符串编码值中的值传递。

Querystring encoded(Post或Get)看起来像:a=1&b=2&c=3

所以你的查询字符串看起来像skipRecords=5&sortParam={column:'UserName',order:'desc' }

MVC不会双重解码querystring和json。

答案 1 :(得分:0)

使用POST并将[FromBody]添加到您的'排序'动作方法中的对象参数。