2017-02-16 1 views
2

Je vais avoir des problèmes avec les routages dans mon projet MVC ne fonctionne pas ...Acheminement spécial MVC ne fonctionne pas

Je veux que tous mes points de vue dans le dossier Views > Shared comme celui-ci:

Error.cshtml (par défaut)
Index.cshtml (par défaut)
Overview.cshtml (coutume que je fait)
Recordings.cshtml (coutume que je fait)

J'ai alors créé un contrôleur partagé pour gérer toutes les vues comme celui-ci:

public class SharedController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Error() 
    { 
     return View(); 
    } 

    public ActionResult Overview() 
    { 
     return View(); 
    } 

    public ActionResult Recordings() 
    { 
     return View(); 
    } 
} 

Mon RouteConfig.cs ressemble à ceci:

public static void RegisterRoutes(RouteCollection routes) 
{  
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    // Map to specific pages under Shared controller: 
    routes.MapRoute("SharedPages", "{action}/{id}", 
     new { controller = "Shared", action = @"Overview|Recordings", id = UrlParameter.Optional }); 

    // Use the default rout for all other pages: 
    routes.MapRoute("Default", "{controller}/{action}/{id}", 
     new { controller = "Shared", action = "Index", id = UrlParameter.Optional } 
    ); 

    // Show the Error page for anything else (404): 
    routes.MapRoute("Error", "{*url}", 
     new { controller = "Shared", action = "Error" } 
    ); 
} 

Je veux que le routage fonctionne comme ceci:

: // (url)/(root - aucune action spécifiée) -> Shared/Index.cshtml
: // (url)/Index -> Shared/Index.cshtml
: // (url)/Vue d'ensemble -> Shared/Overview.cshtml
: // (url)/Enregistrements -> Shared/Recordings.cshtml
: // (url)/quoi (ou si un erreur se produit) -> Shared/Error.cshtml

Mais cela ne fonctionne pas comme prévu. Si je vais à ://(url)/ (racine), je reçois un HTTP 404 - The resource cannot be found. Si je vais par exemple ://(url)/Overview, ça fonctionne très bien.

Comment puis-je le faire fonctionner comme je le veux?

+0

Essayez ceci: http: // stackoverflow .com/a/11474788/231716 –

Répondre

0

L'ordre dans lequel vous mappez l'itinéraire est important et les premières correspondances gagnent. Cela signifie que même s'il n'y a pas de ressource là-bas, il correspond à la route qu'il utilisera.

public static void RegisterRoutes(RouteCollection routes) 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    // Use specific rout for all other pages: 
    routes.MapRoute("WhateverA", "WhateverA/{action}/{id}", 
     new { controller = "WhateverA", action = "Index", id = UrlParameter.Optional } 
    ); 

    routes.MapRoute("WhateverB", "WhateverB/{action}/{id}", 
     new { controller = "WhateverB", action = "Index", id = UrlParameter.Optional } 
    ); 

    // Map to specific pages under Shared controller: 
    routes.MapRoute("RootPages", "{action}/{id}", 
     new { controller = "Shared", action = "Index", id = UrlParameter.Optional }); 

    // Show the Error page for anything else (404): 
    routes.MapRoute("Error", "{*url}", 
     new { controller = "Shared", action = "Error" } 
    ); 
} 

Le problème avec les routes Default et SharedPages est qu'ils entrent en conflit les uns avec les autres. Vous devrez peut-être fournir des itinéraires spécifiques pour d'autres contrôleurs s'ils existent. D'autres sages l'autre option est d'utiliser des attributs de routage pour les autres contrôleurs et routage basé sur la convention-pour vos routes racines et erreur

public static void RegisterRoutes(RouteCollection routes) 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    //Attribute routing 
    routes.MapMvcAttributeRoutes(); 

    // Map to specific pages under Shared controller: 
    routes.MapRoute("RootPages", "{action}/{id}", 
     new { controller = "Shared", action = "Index", id = UrlParameter.Optional }); 

    // Show the Error page for anything else (404): 
    routes.MapRoute("Error", "{*url}", 
     new { controller = "Shared", action = "Error" } 
    ); 
} 

avec les contrôleurs décorés en conséquence

[RoutePrefix("WhatEver")] 
public class WhatEverController : Controller { 
    //GET whatever 
    [HttpGet] 
    [Route("")] 
    public ActionResult Index() { ... } 
} 
+0

Quelque chose avec zéro, 1, 2 ou 3 segments dans l'URL correspondra à la route 'Default' et' 'SharedPages' ne sera jamais atteinte –

+0

@StephenMuecke, Oui à cause des valeurs par défaut. bonne prise. devra revoir cette réponse. – Nkosi

+0

Si OP veut omettre le nom du contrôleur, alors une route spécifique est requise pour chaque méthode, ou une contrainte d'itinéraire (en supposant qu'il y ait d'autres contrôleurs) –