ASP.NET WebAPI路由问题

时间:2013-07-05 13:40:53

标签: c# rest asp.net-web-api asp.net-web-api-routing

说我有以下行动;

// api/products
public IEnumerable<ProductDto> GetProducts()
public ProductDto GetProduct(int id)

// api/products/{productId}/covers
public IEnumerable<CoverDto> GetCovers(int productId)

创建路径以用作“主”产品的快捷方式的最佳方法是什么?api/products/master

我已经尝试添加主控制器,并将上面的路由到它,但是我收到以下错误:

The parameters dictionary contains a null entry for parameter 'id' 
of non-nullable type 'System.Int32' for method 'ProductDto GetProduct(Int32)' 
in 'ProductsController'. An optional parameter must be a reference type, 
a nullable type, or be declared as an optional parameter.

要解决此问题,我已尝试将正常的产品路线更新为api/products/{id:int},但无济于事。

我想以下结果;唯一的区别是“主”产品将通过代码获得,而不是id

api/products
api/products/1
api/products/1/covers
api/products/master
api/products/master/covers

1 个答案:

答案 0 :(得分:0)

这些路线应该可以解决问题:

config.Routes.MapHttpRoute(
    name: "MasterAction",
    routeTemplate: "api/{controller}/master/{action}",
    defaults: new { action = "GetProduct", id = 999 } // or whatever your master id is
);

config.Routes.MapHttpRoute(
    name: "Action",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new { action = "GetProduct" }
);

config.Routes.MapHttpRoute(
    name: "Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

您需要将GetCovers方法的参数名称从productId更改为id,否则您需要添加一些定义{productId}的路径。< / p>

使用“cover”路由,您需要将URI更改为:

api/products/1/getcovers
api/products/master/getcovers

或者,如果您想保持URI不变,则需要将操作方法​​更改为如下所示

[HttpGet]
public IEnumerable<CoverDto> Covers(int id)