2012-10-03 95 views
2

在我的控制器UserApiController,我有以下功能:asp.net的MVC Web API相同的控制器不同的功能參數

public object GetUsers(string CountryID, string StateID) 
{ 
    //biz 
} 

public object GetPositions(int CompanyID, int DepartmentID) 
{ 
    //biz 
} 

在我的控制器SalesApiController,我有以下功能:

public object GetOrders(string CountryID, int CompanyID) 
{ 
    //biz 
} 

public object GetProducts(string CountrID, string StateID, int CompanyID) 
{ 
    //biz 
} 

在web api配置中,我可以像這樣映射:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{CountryID}/{StateID}", 
    defaults: new { } 

它適用於UserApiControll er.GetUsers作爲函數簽名只與GetUsers匹配。

現在,問題:

1.how定義一個路由處理與相同量的參數(或者在相同或不同的控制器)

2.how不同的函數來定義一個路由來處理不同具有不同數量參數的功能(如果可能,在相同或不同控制器內)

+1

既然這是webapi,爲什麼要擔心路由參數?爲什麼不使用普通的查詢字符串參數? – danludwig

+0

是的,不,我們可以使用舊學校的查詢字符串,但最好堅持休息,因爲這是網絡API的本質:) – unruledboy

回答

2

您可以創建一個像這樣的屬性,然後使用此屬性修飾您的操作。 您仍然需要創建一條類似於您所做的匹配參數數量的路線。

public class SomeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    for(int i = 0; i <= filterContext.ActionParameters.Count; i++) 
    { 
     // i + 2 is to not consider controller and action parameters 
     filterContext.ActionParameters[filterContext.ActionParameters.ElementAt(i).Key] = 
     Convert.ChangeType(
      filterContext.Controller.ControllerContext.RouteData.Values.ElementAt(i + 2).Value, 
      filterContext.ActionDescriptor.GetParameters()[i].ParameterType 
     ); 
     } 
    } 
} 

我希望它有幫助。

+0

正如我可以從代碼推斷,你是動態設置參數值。但它會工作,甚至參數的名稱是不一樣的,就像UserApiController中的兩個函數只映射一個路由? – unruledboy

+0

是的,它會的。我創建了完全相同的控制器在發佈之前對其進行測試。 它也適用於SalesApiController.GetOrders操作。 –

+0

對不起,我仍然面臨404錯誤,請問你的web api路由映射嗎? – unruledboy

3

1.how以限定途徑用相同量的參數(或者在相同或不同的控制器)

有幾種解決方案在這裏以處理不同的功能。

  • 使用多條路線。以您的UserApiController爲例,很難有一條適用於2個操作的路由,它們具有不同的參數名稱。我建議增加以下兩條路線:

    config.Routes.MapHttpRoute(
         name: "DefaultApi-UserApiGetUsers", 
         routeTemplate: "api/{controller}/GetUsers/{CountryID}/{StateID}", 
         defaults: new { action = "GetUsers" }); 
    
        config.Routes.MapHttpRoute(
         name: "DefaultApi-UserApiGetPositions", 
         routeTemplate: "api/{controller}/GetPositions/{CompanyID}/{DepartmentID}", 
         defaults: new { action = "GetPositions" }); 
    
  • 使用查詢字符串參數danludwig已建議。通過這種方式,你只需要這一個途徑:??

    config.Routes.MapHttpRoute(
         name: "DefaultApiOnlyRoute", 
         routeTemplate: "api/{controller}/{action}"); 
    
    1. API/UserApi/GetUsers CountryID =美國& STATEID = WA
    2. API/UserApi/GetPositions CompanyID = 123 & DepartmentID的= 456

2。如何定義一個路由來處理具有不同量的參數不同的功能(或者內相同或不同的控制器,如果可能的話)

  • 同樣,定義多個路由:

    config.Routes.MapHttpRoute(
         name: "DefaultApi-SalesApi2Params", 
         routeTemplate: "api/{controller}/{action}/{CountryID}/{CompanyID}"); 
    
        config.Routes.MapHttpRoute(
         name: "DefaultApi-SalesApi3Params", 
         routeTemplate: "api/{controller}/{action}/{CountryID}/{StateID}/{CompanyID}"); 
    
  • 使用查詢字符串參數,只有一個路由 - 即上面的'DefaultApiOnlyRoute'。

    1. API/SalesApi/GetOrders?CountryID =美國& CompanyID = 123
    2. API/SalesApi /的GetProducts?CountryID =美國& STATEID = WA & CompanyID = 123

希望這幫助。

+0

嗨,關於查詢字符串,我們知道它應該工作。在談論web api路由時,我知道我們可以分別爲每個動作定義路由,但是想象一下,有很多功能,我不相信我們能夠承受時間。 – unruledboy

+0

有一些第三方nuget軟件包,比如你可以查看的AttributeRouting。 –

相關問題