【发布时间】:2017-08-15 14:14:31
【问题描述】:
我有一个带有一些 CRUD 操作的典型 API。我通常需要根据不同的参数获取某些对象。
一种方法是使用以下方法:
GetProjectsByCustomerId(int customerId);
GetProjectsBySigneeId(int signeeId);
但是,在我的服务层(在这种情况下为ProjectService),我通常使用如下方法,其中ProjectSpecification 通常具有相当多的字段甚至列表:
public IEnumerable<Project> GetBySpecification(ProjectSpecification projectSpecification)
这意味着,在我的梦想世界中,我希望有如下端点:
-
/api/projects(空规范,返回完整列表) -
/api/projects?customerid=2(为 id 为 2 的客户获取项目) -
/api/projects?signeeid=2,3(获取签名者 id 为 2 和 3 的项目)
我的问题是 - 这是怎么做的
我的第一次尝试是在我的ProjectController 中添加这个(调用我的ProjectService):
public class ProjectsController : ApiController
{
public IEnumerable<Project> GetProjects(ProjectSpecification projectSpecification)
{
var projects = _projectService.GetBySpecification(projectSpecification);
return projects;
}
}
但是假设我打开了这个 URL:
/api/Projects?CustomerId=2
这不会被解析为 ProjectSpecification 视图模型。但是,如果我将控制器签名更改为:
public IEnumerable<Project> GetProjects(int customerid) { }
它会起作用,因为它是一个简单的类型。
我当然可以构建一些参数地狱,但我想我缺少一些非常明显的 MVC 魔法 - 可能在路由中? :-)
【问题讨论】:
-
显示
ProjectSpecification作为示例的一部分。还要查看参数上的FromUri属性 -
ProjectSpecification类可以正常工作,但您可能需要构建自定义模型绑定器(一点也不难)。或者,您可能想查看 OData,它几乎可以为您做到这一点。 -
@DavidG 我认为你是对的,ODATA 可能是我想要的,但为了这里的目的,让我们坚持使用 REST。这里自定义模态绑定器的最简单示例是什么? (谢谢顺便说一句=))
-
对于 web api 看看这个 docs.microsoft.com/en-us/aspnet/web-api/overview/… 。
[FromUri]对于这种情况应该足够简单。
标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api-routing