我想做的是允许某人发布:
[{...}, {...}] or {...}
到路由并将其正确绑定(bind)到:
... Post(IEnumerable<MyModel> models)
如果我发布一个集合([{...}, {...}]
),我可以正常工作,但我希望它创建一个包含一个对象的集合,同时我也将有效的 json 作为单个对象发布({...}
)
我尝试这样做的原因是因为我们的 API 针对用户在运行时定义的模型动态工作,所以我不知道 uri 代表列表还是单个资源。
我可以通过客户 IModelBinder 来实现这一点,但我想知道是否有一种方法可以让 jsonserializer 在没有任何自定义代码的情况下处理这个用例?
最佳答案
一种解决方案是让两个 API 方法调用一个执行相同逻辑的私有(private)方法。例如:
public HttpResponseMessage Post(IEnumerable<MyModel> models)
{
return DoSomething(models);
}
public HttpResponseMessage Post(MyModel model)
{
return DoSomething(new List<MyModel> { model });
}
private HttpResponseMessage DoSomething(IEnumerable<MyModel> models)
{
// Do something
}
Web API 会根据传入的参数确定调用哪一个,但两者会在幕后共享相同的代码。
更新:如果您的参数来自正文,这里有一些解决方案:How to work with ASP.Net WebApi overloaded methods?
关于c# - WebAPI,将一个或集合对象发布到同一操作而不更改消息正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772983/