【问题标题】:MVC4 not binding a list of basic typesMVC4 未绑定基本类型列表
【发布时间】:2012-12-03 23:11:22
【问题描述】:

我这辈子都无法绑定这些数据。这是我的 JavaScript:

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

和控制器动作:

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 为何会破坏此绑定有任何见解,我仍然很感兴趣。

【问题讨论】:

  • 不确定最后的编辑 - 不会在查询字符串中添加空格会破坏它吗?如果没有,我想它会将空格转换为 %20 :)
  • 我能问一下您为什么使用整数列表而不是数组吗?或者更好的是,一个 params int 数组?您是否正在尝试检索数据或向您的控制器发送订单请求?
  • 我正在发送一个 POST 以从一组库存项目中创建一个订单。我不确定“params int array”是什么意思。
  • 您需要在 Ajax 帖子中设置“traditional: true”才能使数组正常工作。我已经更新了我的答案,试试看。
  • 显然 Web API 使用了不同的模型绑定器:stackoverflow.com/a/9910490/1505426。好像有问题:stackoverflow.com/q/9592838/1505426

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


【解决方案1】:

它不起作用的原因是因为您使用的是 [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
    }              
});

【讨论】:

  • 这是一个很好的收获......不幸的是,在我添加 HttpPost 之前它不起作用(这是我的“这里到底发生了什么?”过程的一部分)并且仍然没有当我删除它时工作。
  • 如果我保留帖子并将列表作为数据提交,它也不起作用。
  • 我认为 ajax 命令不是问题?即 - 如果您直接输入带有查询字符串的 url,它仍然会失败?
  • 它会失败,因为它应用了 [HttpPost] 属性,这意味着它只会接受 Post 请求。并在浏览器上输入 url(我假设这就是您所指的)是一个 Get 请求。我已经通过删除“traditional:true”属性来测试我的帖子请求,结果就是 admanb 所看到的
  • @Jack - admanb 提到 HttpPost 最初并不存在,他只是在尝试让它工作时才添加它。我从问题中假设(因为提供了各种查询字符串),如果它被删除(或更改为HttpGet),那么问题仍然存在。直接使用 HttpGet 和带有查询字符串的 URL 进行测试有助于找出实际问题所在。
【解决方案2】:

这个Haacked blog post 可能会有所帮助。具体来说,看他的第一个例子,如果你把IList改成ICollection会发生什么?

这样的“应该”工作

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

使用查询字符串

?InvItemIDs=188475&InvItemIDs=188490

【讨论】:

  • 我希望是这样,但我已经读了十几遍了。我已经使用了基本符号和 [0]=,[1]= 符号,它们都没有约束力。
  • 将 IList 更改为 ICollection 也没有效果。也不会将其更改为 List。
  • 等等 - 你的参数是InvItemIDs(复数),而你发送的是InvItemID(单数)?
  • 上帝,我希望。可悲的是,我只是把那些打错了。我肯定会发送 InvItemID。
  • 我刚刚创建了一个新的 MVC3 应用程序(这里没有 MVC4 - 运行 "ahem" XP),将 IList&lt;int&gt; InvItemIDs 添加到 About 中的 About 操作并调用它通过http://localhost/Home/About?InvItemIDs=188475&amp;InvItemIDs=188490。这工作得很好,所以要么它是 MVC4 特性,要么你已经做了一些事情,比如更改路由、默认模型绑定器等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
相关资源
最近更新 更多