我有一个控制器来获取资源(比如,员工),它有两个属性(比如,CategoryId和DepartmentId)。我需要配置路由以支持以下URL:
~/api/employees/1234 [to get the employee with employeeId=1234]
~/api/employees [to get all the employees]
~/api/employees?departmentid=1 [to get all the employees with departmentId=1]
,控制器代码如下所示:
public IEnumerable<Employee> Get()
{
....
}
public IEnumerable<Employee> Get(int employeeId, int departmentId = -1, int categoryId = -1)
{
.....
}
如何配置此控制器的路由?
由于
答案 0 :(得分:0)
对于任何querystyring参数,在路由方面都没有办法:只需让控制器方法parmater与qs参数名称匹配(不区分大小写)。
如果您的方法参数引用了uri段,则方法参数名称必须与大括号之间的路径参数/段匹配
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "/api/{controller}/{employeeId}",
defaults: new { id = RouteParameter.Optional }
);
这意味着您需要一个具有以下方法的控制器
public class EmployeesController : ApiController
{
public IEnumerable<Employee> Get(int employeeId){...}
}
请记住,除非您使用操作,否则在您的控制器上每个http动词只能使用一种方法 换句话说,除非你对两个方法都使用显式操作,否则你的样本有2个动词获取方法将不起作用。
答案 1 :(得分:0)
你看过使用属性路由吗?我们现在广泛使用属性路由,以至于我们完全摆脱了MapHttpRoute的默认/控制器/动作类型路由。
相反,我们按如下方式装饰我们的控制器。首先,我们为控制器创建一个路由前缀,以便我们知道我们需要的基本路由
/// <summary> A controller for handling products. </summary>
[RoutePrefix("api/purchasing/locations/{locationid}/products")]
public class ProductsController : PurchasingController
{
然后对于控制器中的每个动作,我们按如下方式装饰它:
[Route("", Name = "GetAllProducts")]
public IHttpActionResult GetAllProducts(int locationid, ODataQueryOptions<FourthPurchasingAPI.Models.Product> queryOptions)
{
IList<Product> products = this.GetProducts(locationid);
和
[Route("{productid}", Name = "GetProductById")]
public IHttpActionResult GetProduct(int locationid, string productid)
{
Product product = this.GetProductByID(locationid, productid);
所以对api/purchasing/locations/1/products/的调用将解析为名为“GetAllProducts”的路由 并且对api/purchasing/locations/1/products/1的调用将解析为名为“GetProductById”的路线
然后,您可以在控制器中使用相同的签名创建另一个GetProduct操作,只需适当地设置属性路由,例如
[Route("/department/{departmentId}", Name = "GetAllProductsForDepartment")]
public IHttpActionResult GetAllProductsWithDeptId(int locationid, int departmentId)
{
IList<Product> products = this.GetProducts(locationid, departmentId);
现在对api/purchasing/locations/1/products/department/1234的调用将解析为名为“GetAllProductsForDepartment”的路线
我知道这个例子正在使用Web Api 2,但在Web Api中查看this link的属性路由。它应该完全相同,而你将返回IHttpActionResult以外的东西。