我最近在asp.net项目中在现有的MVC控制器旁边添加了一个webapi控制器。我这样做是为了允许Swashbuckle之类的功能,这些功能是常规MVC API控制器所不具备的。
但是,我注意到WebApi控制器没有像MVC控制器那样解析列表中的对象。
此模式适用于MVC控制器使用AJAX提交表单数据。
<body>
<form action="cart/additems" method="post" id="add-form">
<input type="hidden" name="items[0].Id" value="de63da9b-f4c8-4727-9ef8-0bae8a538503" />
<input type="hidden" name="items[0].Quantity" value="1" />
<input type="hidden" name="items[1].Id" value="de63da9b-f4c8-4727-9ef8-0bae8a538503" />
<input type="hidden" name="items[1].Quantity" value="1" />
<button type="submit" class="button">ADD</a>
</form>
<a href="#" id="link-click">click me</a>
</body>
<script>
$('#link-click').click(function() {
$.ajax({
url: '/cart/additems',
type: 'post',
data: $('#add-form').serialize(),
success: function () { }
});
});
</script>
以及相应的MVC控制器方法
public ActionResult AddItems(List<OrderItem> items)
{
...
}
使用MVC控制器时,将正确填充List<OrderItem> items
参数。但是,当我使用相同的方法签名切换到WebApi时,items
未正确填充。我尝试了很多事情,例如添加[FromUri]
和[FromBody]
属性,并从post
更改为get
。
当原始javascript数据对象作为ajax调用中的data参数发送时,WebApi方法起作用。因此,我目前唯一能想到的就是编写一段代码,这些代码采用$('form').serialize()
或$('form').serializeObject()
jQuery结果,并根据它们生成一个javascript数组。但是,看来这应该已经解决了。
有人知道我将如何修改WebApi控制器,使其像MVC控制器一样接受查询字符串列表注释吗?