2

Я следующий контроллер WebAPI:Web API Routing Не признавая параметры

namespace MyApp.WebApi.Controllers 
{ 
    [RoutePrefix("api/listing")] 
    public class ListingController : ApiController 
    { 
     [Route("{firstparam:int?}/{nextparam:int?}")] 
     public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12) 
     { 
      // firstparam is always 100, and nextparam is always 12 

Однако, я попытался с указанием URL:

http://localhost:56004/#/listing?firstparam=2 

Если я указать URL-адрес, как это:

http://localhost:56004/#/listing/2 

Затем он разбивает маршрут.

Очевидно, что я пропущу что-то относительно маршрутизации; пожалуйста, может кто-нибудь указать мне в правильном направлении?

ответ

1

Вы используете несколько необязательных параметров, которые не работают хорошо для routeTemplates. Обычно последний параметр имеет тенденцию быть необязательным параметром.

Документация: Attribute Routing in ASP.NET Web API 2: Optional URI Parameters and Default Values

FIrst убедитесь, что маршрутизация атрибут включен

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Чтобы получить то, что вы после

[RoutePrefix("api/listing")] 
public class ListingController : ApiController { 

    //GET api/listing 
    //GET api/listing?firstparam=x 
    //GET api/listing?nextparam=y 
    //GET api/listing?firstparam=x&nextparam=y 
    [HttpGet] 
    [Route("")] 
    public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12) { ... } 
} 

Проблема с наличием нескольких параметров встроенных, которые опционально что маршрутизатор не знает, что использовать, поэтому они, как правило, находятся в конце URL-адреса.

Однако, чтобы получить их в соответствии с тем, как вы упомянули в своем примере, вам понадобятся несколько маршрутов.

[RoutePrefix("api/listing")] 
public class ListingController : ApiController { 

    //GET api/listing 
    [HttpGet] 
    [Route("")] 
    public IEnumerable<ListItem> Get() { return Get(100, 12); } 

    //GET api/listing/2 
    //GET api/listing/2/5 
    [HttpGet] 
    [Route("{firstparam:int}/{nextparam:int?}")] 
    public IEnumerable<ListItem> Get(int firstparam, int nextparam = 12) { ... } 
} 
0

Вы можете попробовать использовать атрибут [FromUri] в параметрах метода Get() для извлечения любых параметров запроса, которые передаются в uri "/ listing" вместе с классом, который состоит из свойств int firstparam и secondparam.

namespace MyApp.WebApi.Controllers 
{ 
    [RoutePrefix("api/listing")] 
    public class ListingController : ApiController 
    { 
     [Route("")] 
     [HttpGet] 
     public IEnumerable<ListItem> Get([FromUri] ClassRepresentingParams params) 
     { 

Надеюсь, это поможет.

+0

Каким будет URL-адрес для этого? Похоже, что это прерывает маршрутизацию (то есть, она не находит Get). –

+0

Попробуйте добавить атрибут [HttpGet] к этому методу. Я обновил свой ответ. –

+0

HttpGet ("") не компилируется. Без кавычек это не имеет значения, я все еще теряю маршрутизацию –