Attribut de routage et à l'héritage
Je joue avec l'idée d'avoir un contrôleur de base qui utilise un référentiel générique de fournir les méthodes CRUD de base pour mon API contrôleurs de sorte que je n'ai pas à dupliquer le même code de base dans chaque nouveau contrôleur. Mais je suis en cours d'exécution dans des problèmes avec le service de routage attribut être reconnu quand il est dans la base de contrôleur. Pour montrer exactement ce que le problème que je vais avoir, j'ai créé une, très simple, WebAPI contrôleur.
Quand j'ai un Get
méthode dans le Contrôleur principal et il hérite de la ApiController
directement je n'ai pas de problèmes et cela fonctionne comme prévu.
[RoutePrefix("admin/test")]
public class TestController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
Quand je bouge la Get
méthode dans un contrôleur de base c'est de retourner le contenu de la page 404.
[RoutePrefix("admin/test")]
public class TestController : TestBaseController
{
}
public class TestBaseController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
Certaines plus intéressantes notes:
-
Je peux accéder à l'action à
GET
/Test/1
. Donc, c'est de trouver qu'il est fondé sur la route par défaut toujours. -
Lorsque j'essaie d'accéder à
POST
/admin/test
, il retourne du JSON{
"Message":"Pas de HTTP ressource a été trouvée, qui correspond à l'URI de la demande"http://test.com/admin/test'.",
"MessageDetail":"Aucun type a été trouvé qui correspond le contrôleur nommé 'admin'."
}
Personne ne sait de façon à obtenir le routage de travailler avec des attributs à partir d'un contrôleur de base?
- Je suis en train d'accomplir exactement la même chose - l'utilisation d'une api de base de contrôleur pour gérer CRUD - je suis surpris qu'il n'est pas plus commun. C'est la première fois que j'ai vu mention de quelqu'un d'autre d'essayer, et je suis maintenant coincé à l'acheminement de l'héritage de problème. Pourriez-vous partager ce que vous êtes en train de faire?
- J'ai le contrôleur de base ont protégé les méthodes qui implémentent les opérations CRUD et puis, quand je créer un nouveau contrôleur, j'ai créer la méthode publique et de l'avoir appeler la méthode protégée. De cette façon, je peux mettre les itinéraires sur la méthode dans le contrôleur, et non pas dans le contrôleur de base, et ne pas avoir à dupliquer le code partout. Je n'ai pas l'amour, mais l'alternative était de ne pas utiliser de Route attributs et qui n'allait pas de travail dans ma situation, pour diverses raisons.
- Merci pour la réponse. Je suis allé avec quelque chose de semblable, juste appel de base.[Get|Post|Put|Delete]() et passant à travers les paramètres. Ce n'est pas idéal, mais je suppose que l'avantage est qu'il est plus évident pour les gens qui ne connaissent pas le code où mettre personnalisé CRUD actions. Avez-vous trouvé d'autres ressources en ligne que de discuter de l'utilisation d'un contrôleur de base pour gérer les opérations CRUD? Ma recherche m'a donné aucun résultat.
- Merci de voter pour la question, j'ai ouvert si vous souhaitez les ajouter à l'héritage de AttributeRouting - aspnetwebstack.codeplex.com/workitem/1688
Vous devez vous connecter pour publier un commentaire.
Attribut routes ne peut pas être héritée. C'était une volonté délibérée de décision de conception. On ne se sent pas bien et n'ai pas vu valide les scénarios où il serait judicieux d'hériter d'eux.
Pourrait vous donner un scénario plus réaliste qu'à l'endroit où vous voulez l'utiliser?
[Mise à jour(3/24/2014)]
Dans la prochaine version 5.2 de MVC, Web API, il va y avoir un point d'extensibilité appelé
System.Web.Http.Routing.IDirectRouteProvider
à travers lequel vous pouvez activer l'héritage scénario que vous cherchez ici. Vous pouvez essayer vous-même à l'aide de la dernière nuit versions(documentation sur la façon d'utiliser la nuit s'appuie est ici)[Mise à jour(7/31/2014)]
Exemple de la façon dont cela peut être fait dans l'API Web
2.2
de presse:RoutePrefix("api/v1")
et héritent alors que le préfixe pour tous les contrôleurs-je construire. De cette façon, je peux changer cela sans crainte de vissage, et aussi je n'ai pas à le paramétrer manuellement pour chaque nouveau contrôleur-je faire (ce qui peut introduire des erreurs). Mais c'est pour faire des trucs dans l'autre sens (set[Route("")]
sur le contrôleur de parent et de définir[RoutePrefix("")]
sur l'enfant), qui n'a absolument aucun sens pour moi!À l'aide de l'API Web 2.2, vous pouvez:
comme indiqué ici: http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22
Obtenu.
Une mise en garde ici est que l'action de routage paramètre doit être le même que le nom de l'action. Je ne pouvais pas trouver un moyen de contourner cela. (Vous ne pouvez pas renommer l'itinéraire avec un RouteAttribute)