ASP.NET MVC/Web API 模型绑定项目到集合
ASP.NET MVC/Web API model binding item to collection
我正在使用 Web API 作为 ExtJS 数据存储的入口点,其中在批处理模式下启用了自动同步。这意味着我定义的 Web API 方法可以仅使用 1 个项目或项目集合来调用,如下所述。
只有 1 件商品的案例:
{
"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 个项目的绑定转换为项目集合,这样我就可以只使用 1 个接受项目列表的操作。这可能吗?是否有可用的示例(和节省时间的方法)?
感谢 Peter Kellner,我调查了这个问题,ExtJS 的数据存储编写器配置中似乎有一个配置设置可以启用我的请求:
proxy: {
headers: { 'Accept': 'application/json' },
type: 'ajax',
api: {
create: '/api/Appointments/Add',
update: '/api/Appointments/Update',
destroy: '/api/Appointments/Destroy'
},
reader: {
type: 'json'
},
writer: {
type: 'json',
writeAllFields: true,
allowSingle: false <------------------ That did the trick
}
},
我正在使用 Web API 作为 ExtJS 数据存储的入口点,其中在批处理模式下启用了自动同步。这意味着我定义的 Web API 方法可以仅使用 1 个项目或项目集合来调用,如下所述。
只有 1 件商品的案例:
{
"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 个项目的绑定转换为项目集合,这样我就可以只使用 1 个接受项目列表的操作。这可能吗?是否有可用的示例(和节省时间的方法)?
感谢 Peter Kellner,我调查了这个问题,ExtJS 的数据存储编写器配置中似乎有一个配置设置可以启用我的请求:
proxy: {
headers: { 'Accept': 'application/json' },
type: 'ajax',
api: {
create: '/api/Appointments/Add',
update: '/api/Appointments/Update',
destroy: '/api/Appointments/Destroy'
},
reader: {
type: 'json'
},
writer: {
type: 'json',
writeAllFields: true,
allowSingle: false <------------------ That did the trick
}
},