Plusieurs paramètres facultatifs de routage
J'ai le texte suivant définition de la route dans mon webapi projet. J'ai un problème de paramètre n'est pas passé. par exemple;
quand je l'appelle /Controller/Action/param2/date de début/date de fin de la valeur que j'ai passé pour la param2 est pris pour param1 et vice versa.Le problème est, la RoutingModule ne peut pas détecter que la condition de l'itinéraire pour param2 pas param1
Il fonctionne si j'utilise une chaîne de requête dans l'url, mais ne voulez pas utiliser de chaîne de requête. Reconnaissant de votre aide.
Est-il possible de réaliser ce que j'attends?
config.Routes.MapHttpRoute(
name: "RetrieveHistory",
routeTemplate: "{controller}/{action}/{param1}/{param2}/{startDate}/{endDate}",
defaults: new
{
controller = "Vend",
action = "RetrieveUtrnHistory",
param1 = RouteParameter.Optional,
param2 = RouteParameter.Optional,
starDate = RouteParameter.Optional,
endDate = RouteParameter.Optional
});
Grâce
Si vous voyez une URL avec un paramètre manquant, comment savez-vous qui est le paramètre manquant? Si vous pouvez me donner une réponse à cette question (comment le savez-VOUS), je peux vous aider à créer un ensemble d'itinéraires qui vous permettra de faire ce que vous voulez. Si vous n'êtes pas en mesure de le faire, vous pouvez toujours changer la façon d'écrire les Url, et je peux encore vous aider. Donc, s'il vous plaît, mise à jour de la question avec soit une réponse à ma première question, en montrant quelques exemples d'Url et de dire ce paramètre mathcing vous attendent pour chacun d'eux. Il existe des moyens de achiveve ce dont vous avez besoin, mais vous devez expliquer clairement.
Je ne sais pas pourquoi j'ai posté ici question. je ne suis pas très bien connu avec de Routage
Je ne suis pas demandant comment la route... je suis juste vous demander comment vous le savez, les Url sont différentes comme un "être humain". Je vais vous donner quelques idées...
Je ne sais pas pourquoi j'ai posté ici question. je ne suis pas très bien connu avec de Routage
Je ne suis pas demandant comment la route... je suis juste vous demander comment vous le savez, les Url sont différentes comme un "être humain". Je vais vous donner quelques idées...
OriginalL'auteur Akil Deepak | 2014-12-29
Vous devez vous connecter pour publier un commentaire.
Pour résoudre votre problème, vous devez prendre en compte ce genre de choses:
/
comme séparateur, pour fabriquer des pièces d'un itinéraire à distinguerQue vous n'avez pas de dire comment votre URL regarde comme je vais vous montrer mes propres exemples.
Supposons que vous avez un
TestController
Web de l'API de la classe Contrôleur avec une action comme ceci:REMARQUE: avec les routes par défaut d'une API Web du contrôleur de la méthode nommée
GetXxx
est disponible à HTTP GET, une méthode nomméePostXxx
est disponible à l'adresse HTTP POST et ainsi de suite. Cependant, une fois que vous incluezController
etAction
dans le modèle d'URL, vous devez utiliser le[HttpXxx]
attributs pour faire de votre méthode à la méthode HTTP.Paramètre optionnel(s) dans le milieu
Dans ce premier exemple, je suppose que les deux
param1
, etparam2
sont des nombres entiers, etstardDate
etendDate
sont les dates:Si vous souhaitez que la première URL de faire correspondre les paramètres tels que:
et la deuxième du genre:
Vous devez vous inscrire de deux routes, l'une qui correspond à chaque structure d'URL, c'est à dire
Noter que, dans ce cas, les deux voies sont mutuellement exclusifs, c'est à dire une URL unique peut correspondre qu'à une seule des routes, de sorte que vous pouvez les enregistrer dans toutes les autres.
Cependant, vous devez noter que la deuxième URL n'est pas de définir une valeur de
param2
, et laTestAction
méthode exige. Ceci ne fonctionnerait pas: vous devez ajouter une valeur par défaut pour ce paramètre, à la fois dans le contrôleur de la méthode et de la route d'inscription:int? param2 = null
(C# nécessite paramètre facultatif pour être la dernière).defaults: new { param2 = RouteParameter.Optional }
C'est la façon de résoudre le paramètre facultatif dans le milieu de problème. En général, vous aurez besoin de définir plusieurs itinéraires, en fonction du nombre de paramètres optionnels, il y a, et de déclarer ces paramètres avec des valeurs par défaut, dans le site Web de l'API de la méthode d'action.
REMARQUE: comme je l'ai écrit ci-dessus, dans MVC vous n'avez pas besoin de spécifier une valeur par défaut dans le paramètre de méthode pour que cela fonctionne
Contraintes de paramètres
La spécification de contraintes pour un paramètre de route a deux conséquences:
Vous suffit d'ajouter un
constraint
paramètre sur la route de l'enregistrement, comme ceci:Notez qu'il est nécessaire de spécifier un
defaults
paramètre, même si elle est vide.REMARQUE: les contraintes dans ce cas sont une expression régulière qui correspond uniquement aux dates dans l'année 20XX, le mois exprimée en un seul chiffre, ou par 0x ou 1x, et la date comme un seul chiffre ou 0x, 1x, 2x ou 3x, séparés par des tirets. Donc, cette expression va correspondre à
2012-1-1
ou2015-12-30
, mais pas1920-12-30
. Vous devez adapter les regex à vos besoins.Paramètres facultatifs à la fin
À cette époque, j'ai expliqué comment soutenir des paramètres facultatifs, et la façon de spécifier les formats (contraintes) pour eux, pour correspondre à un template de route.
La façon habituelle de définir les paramètres facultatifs est de le faire à la fin de l'URL de modèle, et, dans ce cas, si il manque des params dans une route, ils doivent être tous à la fin de la route. (Comparez cela avec, en option, dans le milieu: elles nécessitent des voies différentes).
Dans cet exemple, si vous voulez rendre facultatif le
param2
, et lastartDate
etendDate
, vous devez définir dans l'itinéraire d'enregistrement, et de définir des valeurs de paramètre par défaut dans la méthode d'action.Le code final devrait ressembler à ceci:
Noter que, dans ce cas:
Multiparam2
route, il aurait tort gérer une URL comme ceci:http://localhost:1179/api/test/testaction/1/2014-12-12/2015-1-1
, avecparam1=1; param2="2014-12-12"; startDate="2015-1-1"
. (Vous pouvez éviter cela avec une contrainte supplémentaire sur param2 qui accepte uniquement les nombres, commeparam2=@"\d+"
)startDate
etendDate
.Conclusions
Vous pouvez gérer les paramètres par défaut dans différentes positions avec soin:
Si vous prévoyez attentivement la façon dont vos itinéraires ressembler, vous pouvez obtenir ce dont vous avez besoin avec un peu de routes et des paramètres optionnels.
OriginalL'auteur JotaBe
JotaBe réponse a été sympa et complet. Juste que vous avez à considérer que si les paramètres sont facultatifs, vous devez écrire routeTemplate avec l'ordre du plus bas des paramètres de la plus haute.
Comme :
OriginalL'auteur ali mahmoodi