2012-09-12 57 views
3

如何在Asp.Net Web API中爲特定路由請求查詢字符串?Asp.Net Web API路由 - 必需的QueryString參數

控制器:

public class AppleController : ApiController 
{ 
    public string Get() { return "hello"; } 
    public string GetString(string x) { return "hello " + x; } 
} 

public class BananaController : ApiController 
{ 
    public string Get() { return "goodbye"; } 
    public string GetInt(int y) { return "goodbye number " + y; } 
} 

期望路線:

/apple  --> AppleController --> Get() 
/apple?x=foo --> AppleController --> Get(x) 
/banana  --> BananaController --> Get() 
/banana?y=123 --> BananaController --> Get(y) 

回答

3

就做這樣的事情:

public string Get(int y = -1) 
{ 
    if(y < 0) return "goodbye"; 
    return "goodbye number " + y; 
} 

這樣,它是一個途徑,並涵蓋所有情況。爲了清晰起見,您可以將每個數據都作爲私有方法來分類。

另一種方法是添加更多路線,但由於這些路線有些特殊,您將不得不添加額外的路線。爲簡單起見,我會說你改變了方法GetStringGetInt以同樣的事情(如GetFromId,因此可以重用的路線:

routes.MapRoute(
    name: "GetFromIdRoutes", 
    url: "{controller}/{id}", 
    defaults: new { action = "GetFromId" } 
); 

routes.MapRoute(
    name: "GetRoutes", 
    url: "{controller}", 
    defaults: new { action = "Get" } 
); 

如果你不把這些足夠一般情況下,你可以用很大的結束另外一個想法是把這些放入區域以避免路由衝突

+0

我希望有些東西感覺不到「哈克」,但我想這將不得不做... – Greg

+0

我會添加另一個路由方法 - 支持 – naspinski

+0

也添加了路由方法。 – naspinski

0

您可以在路線指定查詢字符串作爲可選的或是不(在Global.asax中):

' MapRoute takes the following parameters, in order: 
    ' (1) Pages 
    ' (2) ID of page 
    ' (3) Title of page 
    routes.MapRoute(_ 
     "Pages", _ 
     "Pages/{id}/{title}", _ 
     New With {.controller = "Home", .action = "Pages", .id = UrlParameter.Optional, .title = UrlParameter.Optional} _ 
    ) 

這是VB.NET。

+1

感謝,但我在尋找一種方式與查詢字符串做這個參數 – Greg

+0

你能不能在你的行動使用類似'公共功能登錄(BYVAL模型作爲LogOnModel,BYVAL RETURNURL作爲字符串)作爲ActionResult'? – user1477388

0

我今天早上有一個類似的問題,我想我找到了一個更簡單的方法來配置我的路由,在你的情況下,使用這個:

config.Routes.MapHttpRoute(
    name: "AppleRoute", 
    routeTemplate: "apple", 
    defaults: new { controller = "Apple" } 
); 

config.Routes.MapHttpRoute(
    name: "BananaRoute", 
    routeTemplate: "banana", 
    defaults: new { controller = "Banana" } 
); 

只需指定控制器,並根據您的查詢字符串參數是否存在,讓框架選擇正確的操作。