2013-07-05 4 views
0

Скажите, что у меня есть следующие действия;Ошибка маршрутизации ASP.NET WebAPI

// 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}, но безрезультатно.

Я хотел бы получить следующее: где единственное различие заключается в том, что «мастер» продукт будет получен с помощью кода, не ид

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

ответ

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}.

С «охватывает» маршрутов, вам нужно будет либо изменить URI, чтобы быть:

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

Или, если вы хотите сохранить URIs нетронутыми, вы должны изменить способ действия, чтобы посмотреть

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

Спасибо, но, как я уже сказал, продукт «мастер» должен быть получен с помощью ** кода продукта **, а не идентификатора 999, как у вас. Это означало бы другое действие контроллера, но я не знаю, как это сделать. –

+0

Думаю, я не знаю, что вы подразумеваете под кодом продукта. Каков пример кода продукта? –

Смежные вопросы