2

私のコントローラーUserApiControllerには、次の関数があります。

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 {  }

また、関数のシグネチャはGetUsersとのみ一致するため、UserApiController.GetUsersで機能します。

今、質問:

1.同じ量のパラメーター(同じまたは異なるコントローラー内)で異なる機能を処理するためのルートを定義する方法

2.さまざまな量のパラメーターを使用してさまざまな機能を処理するルートを定義する方法(可能であれば、同じまたは異なるコントローラー内のいずれか)

4

2 に答える 2

3

1.同じ量のパラメーター(同じまたは異なるコントローラー内)で異なる機能を処理するためのルートを定義する方法

ここにはいくつかの解決策があります。

  • 複数のルートを使用します。UserApiControllerを例にとると、パラメーター名が異なる2つのアクションで機能する1つのルートを作成するのは困難です。次の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が提案したように、クエリ文字列パラメータを使用します。このように、あなたはこの1つのルートだけを必要とします:

        config.Routes.MapHttpRoute(
            name: "DefaultApiOnlyRoute",
            routeTemplate: "api/{controller}/{action}");
    
    1. api / UserApi / GetUsers?CountryID = USA&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}");
    
  • 代わりにクエリ文字列パラメータを使用し、ルートを1つだけにします。つまり、上からの「DefaultApiOnlyRoute」です。

    1. api / SalesApi / GetOrders?CountryID = USA&CompanyID = 123
    2. api / SalesApi / GetProducts?CountryID = USA&StateID = WA&CompanyID = 123

お役に立てれば。

于 2012-10-03T20:23:22.980 に答える
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
        );
      }
   }
}

お役に立てば幸いです。

于 2012-10-03T17:37:33.290 に答える