我使用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 ),那么它甚至可以使用数组参数。
答案 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
})