0

假设我有以下动作;

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

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

创建路线以用作“主”产品的快捷方式的最佳方法是什么?IEapi/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
4

1 回答 1

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方法的参数名称从更改productIdid,或者您需要添加更多定义的路由{productId}

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

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

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

[HttpGet]
public IEnumerable<CoverDto> Covers(int id)
于 2013-07-08T15:28:36.930 回答