MVC4没有绑定基本类型列表

时间:2012-12-03 23:11:22

标签: asp.net-mvc jquery asp.net-web-api model-binding

对于我的生活,我不能将这些数据绑定。这是我的JavaScript:

var params = { 'InvItemIDs': ["188475", "188490"]};
$.post("api/Orders/OrderFromInventory?" + $.param(params))

和Controller动作:

public HttpResponseMessage OrderFromInventory(IList<int> InvItemIDs)
{
    return new HttpResponseMessage();
}

我已经构建了查询字符串,以便它发送:

?InvItemIDs=188475&InvItemIDs=188490

以及

?InvItemIDs[]=188475&InvItemIDs[]=188490

甚至

?InvItemIDs[0]=188475&InvItemIDs[1]=188490

并且它们都没有约束力。 InvItemIDs始终为null。我做错了什么?

编辑:

因此,事实证明,这是MVC4中新的Web API控制器代码中的一个错误(或其他东西)。一旦我将完全相同的代码移到标准控制器上,它就开始工作了。

如果有人对Web API为什么会破坏这种绑定有任何见解,我仍然感兴趣。

2 个答案:

答案 0 :(得分:2)

它不起作用的原因是因为你正在使用[HttpPost],期望数据在“post body”而不是URL中发布。

你可以

1, remove httpPost
2. put the list in the post content

您需要为数组设置“traditional:true”才能生效。这是我在本地项目上测试过的示例代码,试一试

var InvItemIDs = ["188475", "188490"];
$.ajax({ type: "POST",
    url: "Home/TestIndex",
    datatype: "json",
    traditional: true,
    data:
    {
        'InvItemIDs': InvItemIDs
    }              
});

答案 1 :(得分:1)

Haacked blog post可能有所帮助。具体来说,看看他的第一个例子,如果你将IList更改为ICollection会怎样?

像这样的“应该”工作

[HttpGet]
public HttpResponseMessage OrderFromInventory(IList<int> InvItemIDs)
{
    return new HttpResponseMessage();
}

使用查询字符串

?InvItemIDs=188475&InvItemIDs=188490