2012-09-27 2 views
24

MVC4 WebAPI 프로젝트에서 라우팅을 구성하려고합니다.쿼리 문자열 매개 변수 이름을 기반으로하는 라우팅

내가 이름 정도 등 자신의 유형에 따라 제품을 검색 할 수 있도록하려면 :

/api/products?name=WidgetX - WidgetX /api/products?type=gadget라는 이름의 모든 제품을 반환 - 라우트는

유형 가젯의 모든 제품을 반환

config.Routes.MapHttpRoute(
    name: "Get by name", 
    routeTemplate: "api/products/{name}", 
    defaults: new { controller = "ProductSearchApi", action = "GetProductsByName", name = string.Empty } 
); 

config.Routes.MapHttpRoute(
    name: "Get by type", 
    routeTemplate: "api/products/{type}", 
    defaults: new { controller = "ProductSearchApi", action = "GetProductsByType", type = string.Empty } 
); 

문제는 쿼리 문자열 매개 변수의 이름이 무시되는 것처럼 보이므로 첫 번째 경로는 항상 사용되는 것이므로 쿼리 문자열 매개 변수의 이름입니다. 경로를 수정하려면 어떻게해야합니까?

답변

30

당신은 쿼리 문자열이 라우팅 매개 변수로 사용되지 않기 때문에 단지 하나의 경로 아래입니다 필요가있는 무엇 :

GetProductsByName(string name) 
{} 

GetProductsByType(string type) 
{} 

라우팅 : 다음과 같은 두 가지 방법을 정의하는 다음

config.Routes.MapHttpRoute(
    name: "Get Products", 
    routeTemplate: "api/products", 
    defaults: new { controller = "ProductSearchApi" } 
); 

그리고, 메커니즘은 스마트 URL을 입력 매개 변수와 동일한 여부를 쿼리 문자열의 이름을 기반으로 올바른 동작을 라우팅 할만큼 충분합니다. 물론 접두사를 가진 모든 방법을

Get이다에이 작업을 읽을 필요가 있습니다 이 http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

0

당신은 경로에서 쿼리 매개 변수를 포함 할 필요가 없습니다 RouteParameter.Optional

+0

RouteParameter 날 물론 요구 사항을 충족하지 않을 제품/ABC /과 같은 URL을 사용하여 만들 것입니다. 쿼리 문자열 매개 변수를 사용할 수 있어야합니다. – rickythefox

4

에 대한 string.Empty을 변경해보십시오. 만 ApiControllers 모두에 HTTP 메소드를 포함하는 하나 개의 간단한 노선도가 있어야한다 :

당신이 실제 경로로 매개 변수를 이동하려면
routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

당신이 경로를 조정해야 할 유일한 시간 인 당신을 하는 것 같지 않습니다. 그런 다음 GET HTTP 방법이 될 두 개의 필드로 검색하기 :

public IEnumerable<Product> Get(string name, string type){ 
    //..your code will have to deal with nulls of each parameter 
} 

당신이 명시 적으로 서로 다른 목적을 위해 다른 컨트롤러를 사용하여 생각해야 한 번에 하나 개의 필드로 검색하십시오. 즉 Get(string type) 메서드가있는 SearchProductByTypeController입니다. 그러면 경로는/api/SearchProductByTypeController입니까? type = gadget

+0

감사합니다. 때때로 문제는 코드가 아니라 아키텍처에 있습니다. ;) – rickythefox

+1

어떤 SearchProductByTypeController 리소스입니까? :피 –

0

컨트롤러가 정상적으로 작동합니까? params의 이름입니다.

public string GetProductsByName(string name) 
    { 
     return "Requested name: " + name; 
    } 

    public string GetProductsByType(string type) 
    { 
     return "Requested type: " + type; 
    } 
관련 문제