如何在JQuery的加载方法中POST Json对象?

时间:2017-04-27 22:57:12

标签: javascript jquery asp.net-mvc asp.net-mvc-5

我使用jQuery的load方法来调用控制器动作。但是控制器无法序列化对象。

控制器

    [HttpPost]
    public ActionResult GetInformation(FilterModel[] filters)
    {
       // do something
    }

模型

public class FilterModel
{
    public string Field { get; set; }
    public string Operator { get; set; }
    public string Value { get; set; }
}

的Javascript

$("#btnSave").click(function () {
    var data = [];
    data.push({
        field: 'field 1',
        operator: 'eq',
        value: '1'
    });

    data.push({
        field: 'field 2',
        operator: 'eq',
        value: '2'
    });       

    $('#mycontainer').load("Home/GetInformation", data, function (response)
    {
      // do something
    })

根据jQuery的文档

  

如果数据作为对象提供,则使用POST方法;除此以外,   假设GET。

因为我正在传递对象,所以jquery正在按预期发出POST请求,但服务器无法序列化该对象。

注意

1> 如果我更改GetInformation()方法以接受单个过滤器(而非数组),如下所示

   [HttpPost]
   public ActionResult GetInformation(FilterModel filter)
   {
     // do something
   }

然后更改JS脚本以发送单个过滤器实例,然后它就可以了。

2> 此外,如果我通过设置正确的内容类型直接使用jquery的https://github.com/jaredhanson/passport-facebook方法来POST数据(而不是使用load ),那么它甚至可以使用数组参数。

1 个答案:

答案 0 :(得分:0)

我找到了。

我可以对data进行字符串化并传递给load方法,但正如我前面提到的,如果data不是对象,那么load方法将使用GET来发出请求。在我的情况下,服务器期待POST,所以它拒绝这样的请求。

所以为了在load方法中POST数组,我必须传递参数名为{filters:data}的数据。像下面的东西

 $('#mycontainer').load("Home/GetInformation", {filters: data}, function (response)
    {
      // do something
    })

参数名称必须与action方法的参数名称匹配。

但为了解决我的问题,我在包装器类中包装了filters数组。使用这种方法,我不必担心匹配参数名称。

  public class FilterWrapper
  {
     public IEnumerable<FilterModel> Filters {get;set;}
  }

并更新操作方法以接受FilterWrapper类而不是数组。

并在javascript中我将数据作为单个对象传递

var filters = {filters : data }
$('#mycontainer').load("Home/GetInformation", filters, function (response)
    {
      // do something
    })