说我有以下行动;
// 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
答案 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)