web-dev-qa-db-fra.com

RoutePrefix vs Route

Je comprends que RoutePrefix n'ajoute pas lui-même de route à la table de routage. Sur vos actions, vous devez avoir un attribut Route déclaré. J'ai du mal à trouver un blog faisant autorité/page msdn/quelque chose qui indique pourquoi par defalut RoutePrefix n'ajoute pas de route à la table de routage.

Quelqu'un a-t-il un article faisant autorité qui contient cela pour être le cas, et si oui, voulez-vous me faire savoir de qui il s'agit. Merci beaucoup.

Modifier Pour clarifier ma question

NE FONCTIONNE PAS

[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
    public int get(){return 1000000;}
}

Travaux

[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
    [Route("")]
    public int get(){return 1000000;}
}

Le scénario ci-dessus fonctionne car nous avons explicitement déclaré que l'action get sur le SteveController a une route vide. Une fois que nous faisons cela, la route est ajoutée au RouteTable

Le premier scénario ne fonctionne pas, car l'utilisation de RoutePrefix n'ajoute rien à la table de routage. RoutePrefix ne générera pas en soi un itinéraire. Cela semble être de notoriété publique, Je veux connaître une source qui explique pourquoi c'est. De préférence un membre respecté de la communauté, c'est-à-dire Jon Skeet ou quelqu'un de l'équipe Microsoft.

21
gh9

Les préfixes de route sont associés aux routes par conception dans le routage d'attribut.

Il est utilisé pour définir un préfixe commun pour un contrôleur entier.

Si vous lisez les notes de publication qui ont introduit la fonctionnalité, vous pourrez mieux comprendre le sujet.

API Web ASP.NET 2

Acheminement des attributs

L'API Web ASP.NET prend désormais en charge le routage d'attributs, grâce à une contribution de Tim McCall. Avec le routage d'attributs, vous pouvez spécifier vos itinéraires d'API Web en annotant vos actions et contrôleurs comme ceci:

[RoutePrefix("orders")] 
public class OrdersController : ApiController 
{ 
    [Route("{id}")] 
    public Order Get(int id) { } 
    [Route("{id}/approve")] 
    public Order Approve(int id) { } 
} 

Le routage d'attributs vous donne plus de contrôle sur les URI de votre API Web. Par exemple, vous pouvez facilement définir une hiérarchie de ressources à l'aide d'un seul contrôleur API:

public class MoviesController : ApiController 
{ 
    [Route("movies")] 
    public IEnumerable<Movie> Get() { } 
    [Route("actors/{actorId}/movies")] 
    public IEnumerable<Movie> GetByActor(int actorId) { } 
    [Route("directors/{directorId}/movies")] 
    public IEnumerable<Movie> GetByDirector(int directorId) { } 
} 

Nouveautés de l'API Web ASP.NET 2.1

Nouveautés de l'API Web ASP.NET 2.2

Un très bon article sur le sujet

plongée profonde ASP.NET 5: routage

Bien qu'aucun expert en la matière, voici ma compréhension de la façon dont cela fonctionne.

Avec le routage d'attributs, le framework inspecte l'attribut de route sur les actions d'un contrôleur afin de créer des entrées de route à ajouter à la table de routage. Donc, tant que vous utilisez le routage d'attributs, vous allez utiliser le [RouteAttribute]. Sans cet attribut, l'action reviendra par défaut au routage basé sur les conventions. RoutePrefixAttribute est un point d'extensibilité qui vous permet de mieux contrôler la façon dont vous définissez vos itinéraires/URL. Les notes de version en disent autant.

À part ma compréhension et le dernier lien fourni, tout le reste a été cité dans la documentation de MS.

19
Nkosi

Pour une source faisant autorité, voici les descriptions de MSDN (accent sur le mien).

RouteAttribute

Placer sur un contrôleur ou une action pour l'exposer directement via une route . Lorsqu'il est placé sur un contrôleur, il s'applique aux actions qui ne contiennent aucun System.Web.Mvc.RouteAttribute.

RoutePrefixAttribute

Annote un contrôleur avec un préfixe d'itinéraire qui s'applique à toutes les actions au sein du contrôleur.

Comme vous pouvez le voir, la description de Route mentionne l'exposition des actions, mais pas RoutePrefix.

7
Robert Dennis