2 votes

asp.net mvc web api même contrôleur paramètres de fonction différents

Dans mon contrôleur UserApiController, j'ai les fonctions suivantes :

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

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

Dans mon contrôleur SalesApiController, j'ai les fonctions suivantes :

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

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

dans la configuration de l'api web, je peux mapper comme ceci :

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

et cela fonctionne pour UserApiController.GetUsers car la signature de la fonction ne correspond qu'à GetUsers.

maintenant, des questions :

1.comment définir une route pour gérer différentes fonctions avec le même nombre de paramètres (dans le même contrôleur ou dans des contrôleurs différents).

2.comment définir une route pour gérer différentes fonctions avec différentes quantités de paramètres (dans le même contrôleur ou dans des contrôleurs différents, si possible).

3voto

Maggie Ying Points 3804

1.comment définir une route pour gérer différentes fonctions avec le même nombre de paramètres (dans le même contrôleur ou dans des contrôleurs différents).

Il existe plusieurs solutions.

  • Utilisez plusieurs itinéraires. Prenez votre UserApiController comme exemple, il est difficile d'avoir une route qui fonctionne avec les 2 actions, dans lesquelles elles ont des noms de paramètres différents. Je suggère d'ajouter les deux routes suivantes :

        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" });
  • Utilisez les paramètres de la chaîne de requête comme l'a suggéré danludwig. De cette façon, vous n'avez besoin que de cette seule route :

        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.comment définir une route pour gérer différentes fonctions avec différentes quantités de paramètres (dans le même contrôleur ou dans des contrôleurs différents, si possible).

  • Là encore, définissez plusieurs routes :

        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}");
  • Utilisez plutôt des paramètres de chaîne de requête et n'ayez qu'une seule route, c'est-à-dire la route 'DefaultApiOnlyRoute' ci-dessus.

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

J'espère que cela vous aidera.

2voto

André Scartezini Points 236

Vous pouvez créer un attribut comme celui-ci, puis agrémenter vos actions de cet attribut. Vous devez toujours créer une route comme celle que vous avez faite qui correspond au nombre de paramètres.

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
        );
      }
   }
}

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X