0
votes

Routage - API Web et MVC dans un projet

J'ai 2 contrôleurs. Tous deux traitant de bar (un enfant de foo).

L'un d'entre eux est pour MVC qui retourne des vues. P>

[Route("api/Foo/Bar")]
[ApiController]
public class FooBarAPIController : ControllerBase
{
    //
}


0 commentaires

4 Réponses :


1
votes

Lorsque vous n'avez pas l'attribut appliqué, FoobarController utilise un routage conventionnel que vous avez probablement déjà par défaut. Il a normalement une index comme action par défaut et vous permet de spécifier également le nom d'action, tout fonctionne donc.

Lorsque vous appliquez l'attribut, toutes les actions de ce contrôleur utilisent maintenant un routage d'attribut. Ces deux types de routage ne sont pas combinés, vous ne pouvez utiliser que l'un ou l'autre. Notez que P>

"avec attribut acheminement le nom du contrôleur et les noms d'action jouent non rôle dans lequel une action est sélectionnée. " P> blockQuote>

( Docs Source ). Donc, ces deux actions deviennent les mêmes, leurs noms ignorés et il est impossible de déterminer lequel à utiliser. Vous devez donc l'aider: P>

[Route("Foo/Bar")]
public class FooBarController : ControllerBase
{
    [Route("")]      // To make it default for "Foo/Bar"
    [Route("Index")] // Combines to define the route template "Foo/Bar/Index"
    public IActionResult Index()
    {
        // ...
    }

    [Route("SomeAction")] // Combines to define the route template "Foo/Bar/SomeAction"
    public IActionResult SomeAction()
    {
        // ...
    }
}


2 commentaires

Ah, merci pour cela. Je pensais que c'était le cas, mais je ne veux pas utiliser le routage d'attribut avec le contrôleur MVC (juste le contrôleur API). Existe-t-il un attribut qui changera la route du contrôleur (sans le modifier en routage d'attributs) que je peux appliquer au contrôleur (et non de démarrage.cs)?


@Beakie Que voulez-vous dire par Je ne veux pas utiliser routage d'attribut avec le MVC ? Comme votre description, cela fonctionne sans [route ("foo / bar")] .



1
votes

Pour votre contrôleur d'API, je vous recommande de changer itinéraire code> à routePrefix ["API"] code>, de cette façon, toutes vos méthodes d'API contienaient alors juste la route (espérons-le nom différent de ce que vous avez pour votre contrôleur domestique.

[RoutePrefix("foo/bar")]
public class MyController : BaseController
{
    public IActionResult Index()
    {
        return View(); //or something
    }

    public IHttpActionResult Contact()
    {
        return View(); //or something
    }
}


2 commentaires

Merci. Dans quel espace de noms est RoutePrefix?


Stackoverflow.com/Questtions/24419324/...



1
votes

Si vous souhaitez rouler foobarcontroller.someaction avec / foo / bar / somaction , vous pouvez essayer quelque chose comme xxx


0 commentaires

0
votes

J'ai réussi à l'obtenir (à comparaître) Utiliser ce qui suit.

[Route("Foo/Bar")]
[Route("Foo/Bar/[action]")]
public class FooBarController : Controller
{
    [HttpGet("")]
    public IActionResult Index()
    {
        return RedirectToAction("SomeAction");
    }

    public IActionResult SomeAction()
    {
        return View();
    }

}


0 commentaires