0
votes

Le routage d'attribut ASP.NET MVC n'atteint pas le contrôleur correct

J'ai quelques contrôleurs comme celui-ci:

// MVC attribute routing
routes.MapMvcAttributeRoutes();

// Default catch all route
routes.MapRoute(
    "Default",
    "{*pathname}",
    new { controller = "CatchAll", action = "Index" });

Mais je n'arrive pas à accéder à mon action d'index dans le contrôleur de navigation latérale - si je navigue vers localhost / side- navigation / test il frappe le contrôleur catch all avec side-navigation / test comme chemin d'accès au lieu de celui de navigation latérale avec test comme chemin d'accès. p>

Quelqu'un peut-il voir quelque chose que je fais mal ici ou comment faire fonctionner le contrôleur de navigation latérale?

Voici la configuration de l'itinéraire:

[RoutePrefix("side-navigation")]
public class SideNavigationController : BaseController
{
    [Route("{pathname}")]
    public ActionResult Index(string pathname)
    {
        SideNavigationPopoutModel model = _sideNavFactory.Value.CreatePopout(pathname);

        if (model != null)
        {
            return View(model);
        }

        return HttpNotFound();
    }
}

public class CatchAllController : BaseController
{
    public ActionResult Index(string pathname)
    {
        CatchAllModel model = _catchAllModelFactory.Value.Create(pathname);

        if (model != null)
        {
            // TODO: Do we need this - what does it do?
            // TempData.Restore(this);

            return View(model);
        }

        return HttpNotFound();
    }
}

Bizarrement, si je change la route de l'index de navigation latérale en test / {chemin d'accès} et navigue vers side-navigation / test / test cela fonctionnera et le contrôleur sera frappé mais je ne veux rien ajouter avant le chemin


3 commentaires

Essayez avec ceci: routes.MapRoute ("Default", "{controller} / {id}", new {controller = "CatchAll", action = "Index", id = ""});


Désolé, cela ne permettrait-il pas simplement un paramètre id sur l'URL et la valeur par défaut d'une chaîne vide? Je ne sais pas comment cela résoudrait le problème de routage, j'ai quand même essayé et cela casse simplement le routage fourre-tout


Désolé c'est une erreur .. vous pouvez essayer avec ceci: routes.MapRoute ("Default", "{controller} / {id}", new {controller = "CatchAll", action = "Index", id = UrlParameter .Optionnel});


3 Réponses :


0
votes

Il semble que vous n'utilisez pas [Area] et mettez l'attribut [Route ("[action]")] au-dessus de la méthode.


1 commentaires

Malheureusement, cela ne fonctionne pas et je ne veux pas ajouter de zone à la structure de l'url (c'est pourquoi je n'utilise pas d'attributs de zone)



0
votes

Ok, j'ai corrigé cela en ajoutant un astérisque avant le chemin:

[RoutePrefix("side-navigation")]
public class SideNavigationController : BaseController
{
    [Route("{*pathname}")]
    public ActionResult Index(string pathname)
    {
    }
}

Si quelqu'un peut expliquer pourquoi cela fonctionne et sans astérisque, ce serait grandement apprécié, car je ont également un contrôleur de produit configuré exactement de la même manière qui n'a pas besoin de l'astérisque


0 commentaires

-3
votes

[RoutePrefix ("side-navigation")] classe publique SideNavigationController: BaseController { [Route ("{* chemin d'accès}")] public ActionResult Index (chaîne chemin d'accès) { } }


2 commentaires

pouvez-vous expliquer pourquoi cela devrait être une solution?


Vous semblez juste avoir copié le code de ma réponse mais pas formaté ou expliqué pourquoi cela devrait fonctionner, donc pas sûr de ce que cela ajoute vraiment