Le routage basé sur le paramètre de chaîne de requête de nom
Je suis en train de configurer le routage dans mon MVC4 WebAPI projet.
Je veux être en mesure de rechercher pour les produits en fonction de leur nom ou de leur type comme suit:
/api/products?name=WidgetX
- retourne tous les produits nommés WidgetX
/api/products?type=gadget
- retourne tous les produits de type gadget
Les routes sont configurés comme ceci:
config.Routes.MapHttpRoute(
name: "Get by name",
routeTemplate: "api/products/{name}",
defaults: new { controller = "ProductSearchApi", action = "GetProductsByName", name = string.Empty }
);
config.Routes.MapHttpRoute(
name: "Get by type",
routeTemplate: "api/products/{type}",
defaults: new { controller = "ProductSearchApi", action = "GetProductsByType", type = string.Empty }
);
Le problème est que le nom du paramètre de chaîne de requête semble être ignoré si le premier est toujours celui qui est utilisé, quel que soit le nom du paramètre de chaîne de requête.
Comment puis-je modifier mon itinéraire pour y arriver?
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez besoin est juste un seul itinéraire ci-dessous, car la chaîne de requête n'est pas utilisé en tant que paramètres de routage:
Et, ensuite, de définir deux méthodes comme ci-dessous:
Le mécanisme de routage smart assez pour l'acheminement de votre url de votre bonne action basé sur le nom de chaîne de requête si la même chose avec des paramètres d'entrée. Bien sûr, sur toutes les méthodes avec le préfixe sont
Get
Vous pourriez avoir besoin de lire ceci:
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection
Vous n'avez pas besoin d'inclure vos paramètres de requête dans l'itinéraire. Il ne devrait être qu'une simple carte d'itinéraire pour couvrir les Méthodes du protocole Http sur l'ensemble de vos ApiControllers:
Le seul moment où vous devez ajuster les routes de l'est, si vous voulez déplacer un paramètre dans le chemin d'accès réel, que vous ne semblez pas être en train de faire. Ensuite, votre
GET
http méthode de recherche par deux domaines:Si vous souhaitez rechercher uniquement par un champ à la fois, alors vous devriez penser à utiliser les différents contrôleurs pour des fins différentes. C'est à dire, un
SearchProductByTypeController
qui a un seulGet(string type)
méthode. La voie serait alors /api/SearchProductByTypeController?type=gadgetSearchProductByTypeController
? 😛essayez de changer
string.Empty
pourRouteParameter.Optional
Êtes-vous sûr que les contrôleurs sont ok? Je veux dire, le nom de la params.