【发布时间】:2015-10-22 12:49:58
【问题描述】:
我使用 Web API 作为 ExtJS 数据存储的入口点,其中自动同步在批处理模式下启用。这意味着我定义的 Web API 方法可以仅使用一项或一组项调用,如下所述。
只有一件物品的箱子:
{
"Category":"fsf",
"Importance":10,
"TaskNo":5467,
"Id":"UnplannedTask-6",
"StartDate":"2015-09-21T03:00:00+02:00",
"EndDate":"2015-09-21T05:00:00+02:00",
"Cls":"",
"Name":"",
"ResourceId":"18"
}
多个项目的案例:
[
{
"Category":"haer",
"Importance":10,
"TaskNo":5,
"Id":"UnplannedTask-5",
"StartDate":"2015-09-21T04:00:00+02:00",
"EndDate":"2015-09-21T06:00:00+02:00",
"Cls":"",
"Name":"",
"ResourceId":"14"
},
{
"Category":"fsf",
"Importance":10,
"TaskNo":5467,
"Id":"UnplannedTask-6",
"StartDate":"2015-09-21T03:00:00+02:00",
"EndDate":"2015-09-21T05:00:00+02:00",
"Cls":"",
"Name":"",
"ResourceId":"18"
}
]
这给我的 Web API 带来了一些问题,因为我注意到重载有点棘手(也许是不可能的)。
这是接受项目列表的 Web API 操作:
[HttpPost]
public async Task<dynamic> Update(IEnumerable<Appointment> appointments)
{
...
}
在它只接受一个的场景中再次出现:
[HttpPost]
public async Task<dynamic> Update(Appointment appointment)
{
...
}
现在,这两个操作都可以单独工作。当只有一项返回时,模型绑定是正确的。发回列表时的情况相同。到目前为止,一切都很好。 然而,不可能知道是 1 个项目还是 10 个项目将通过网络发送。所以我必须能够同时支持这两种操作,但是我所经历的这种方式重载不起作用——这意味着我一次只能使用一个操作。
所以我希望有一个解决方案,我可以使用模型绑定将 1 个项目的绑定转换为项目集合,这样我就可以只使用一个接受项目列表的操作。这可能吗?是否有可用的示例(和节省时间的方法)?
【问题讨论】:
-
使用一个JObject作为输入参数,然后根据它是否是一个数组来解析数据。
-
正如我所建议的,我认为这是最后的手段。解析这样的 JSON 对象很容易出错并且不是很灵活。随着数据的最轻微变化,这将立即中断。我宁愿选择开箱即用的模型绑定功能,但我不太确定这是否可以通过 Web API 实现。
-
不确定这是否有帮助,但这是我为 webapi 和 extjs 写的一篇文章。 peterkellner.net/2013/03/13/…
-
@PeterKellner 感谢您的提示,但除了宣传您自己的博客文章之外,这篇文章对我的问题没有任何意义。您能否根据您对该主题的了解详细说明或提出任何建议?
-
抱歉 hbulens 我不确定如何解决您的问题。我经常在 webapi 的神奇方面苦苦挣扎,试图弄清楚它在匹配传入参数方面做了什么,但没有运气。通常,我只是接受任何进来的东西(我忘记了它的语法)并自己在代码中解析它以找出最佳计划。我还尝试让我的客户始终发送数组(即使是 1 条记录),但听起来这在这里是不可能的。
标签: c# extjs overloading asp.net-web-api model-binding