【问题标题】:Javascript object received as null in mvc controller在 mvc 控制器中接收为 null 的 Javascript 对象
【发布时间】:2014-10-18 22:27:37
【问题描述】:

下面是我的 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)
{

}

下面还定义了 Sort 类:

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

【问题讨论】:

  • 我认为您传入的字符串恰好包含 JSON,而不是 Sort 对象。 sortParam: sort 怎么样
  • @MikeChristensen 是的,我在执行 JSON.stringify 之前尝试过这个,但属性作为 null 传递。
  • 您可以运行 Fiddler 并粘贴正在发送的确切 HTTP 请求吗?这可能会帮助人们发现问题。
  • @MikeChristensen GET /Account/GetUsers?skipRecords=0&sortParam%5Bcolumn%5D=UserName&sortParam%5Border%5D=desc&_=1408990051727 HTTP/1.1

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


【解决方案1】:

您可能正在寻找:

 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 作为查询字符串编码值中的值传递。

查询字符串编码(Post 或 Get)看起来像:a=1&b=2&c=3

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

MVC 不会对查询字符串和 json 进行双重解码。

【讨论】:

  • 我试过了,但对象仍然包含空属性。
  • 去掉字符串化,直接传入原生对象。
  • @BNL 即使这样做,属性也会被接收为空。我在我的问题中添加了 GET 请求,它确实显示了参数值。
  • 你不能通过 GET 发送 JSON,默认模型绑定器不会处理它(因为 get 总是查询字符串/url 编码)。
  • POST 与 JSON.Stringify 一起工作。您可以在发布的代码中添加 type:'POST' 吗?
【解决方案2】:

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

【讨论】:

  • 我使用了 POST 和 JSON.stringify。
猜你喜欢
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
相关资源
最近更新 更多