2014-02-18 40 views
1

我有一個GET()控制器來檢索實體列表。我想一個參數傳遞給動作來過濾返回的對象列表如下:Web API 2控制器不接受QueryString參數

Mysite.com/Users?nameContains=john 

這是我行動的定義:

public IEnumerable<object> Get(string nameContains) 
{ 
    // I want to use nameContains here 
} 

我得到一個錯誤:

The requested resource does not support http method 'GET'.

如果我將該方法恢復爲不能獲取該參數,則該方法有效。

+0

嘗試以身體對象形式發送。你可以得到然後 – Amit

+0

你如何定義你的路線? – ssilas777

+0

@AmitAgrawal我寧願不要因爲它不符合RESTful API最佳實踐。 @ ssilas777 'config.Routes.MapHttpRoute( 名: 「DefaultApi」, routeTemplate: 「API/{控制器} /(編號)」, 的默認值:新{ID = RouteParameter.Optional} );' –

回答

1

試試這個

public IEnumerable<object> Get([FromUri] string nameContains) 
{ 
    // I want to use nameContains here 
} 

此外,由於要在網絡API 2時,您可以使用attribute routing

[Route("users")] 
public IEnumerable<object> Get([FromUri] string nameContains) 
{ 
+0

試過了,它不起作用。同樣的錯誤。 –

0

您可以添加新的路由到WebApiConfig條目。

例如,你的方法定義:

public IEnumerable<object> Get(string nameContains) 
{ 
    // I want to use nameContains here 
} 

地址:

config.Routes.MapHttpRoute(
    name: "GetSampleObject", 
    routeTemplate: "api/{controller}/{nameContains}" 
); 

然後將參數添加到HTTP調用:

GET //<service address>/Api/Data/test 

或在你的方法

使用 HttpUtility.ParseQueryString
// uri: /Api/Data/test 
public IEnumerable<object> Get() 
{ 
    NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query); 
    var contains = nvc["nameContains"]; 
    // BL with nameContains here 
} 
+1

應該沒有必要這樣做。查詢參數映射確實有效。 –

1

對不起,這是我的錯誤,我使用了2個參數,並且我沒有傳遞其中的一個參數(也沒有指定它的默認值),所以它返回一個錯誤。乾杯。