2010-08-27 10 views
5

Comment puis-je associer plusieurs URL à la même action dans asp.net mvcASP.NET MVC multiple de pointage URL pour la même action

Je:

string url1 = "Help/Me"; 
string url2 = "Help/Me/Now"; 
string url3 = "Help/Polemus"; 
string url1 = "Help/Polemus/Tomorow"; 

Dans mes Global.asax.cs fichier que je veux cartographier toutes les URL pour les actions suivantes:

public class PageController : Controller 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

Alors, est-ce que la stratégie est utile à PageController? – Nix

+0

plus dans les lignes de ... J'ai une liste d'URLs aléatoires, et toutes les URLs aléatoires doivent correspondre au PageController. Notez que la liste est déjà définie ... donc je dois essentiellement faire une boucle dans la liste et mapper chaque URL dans cette liste au contrôleur de la page –

Répondre

6

Ajoutez la ligne suivante à votre table de routage:

routes.MapRoute("RouteName", "Help/{Thing}/{OtherThing}", new { controller = "Page" }); 

EDIT:

foreach(string url in urls) 
    routes.MapRoute("RouteName-" + url, url, new { controller = "Page", action = "Index" }); 
+0

c'est presque exactement comme ce que j'avais ... J'ai essayé votre deuxième exemple, cependant, lorsque je navigue vers cette URL, j'obtiens une erreur "ressource introuvable", et j'ai "\ Views \ Page \ Index" associé. –

+0

Essayez ma modification (j'ai oublié le nom de l'action) – SLaks

+0

hehe, avec l'édition, c'est maintenant exactement le même que ma tentative initiale :) –

3

Vous pouvez simplement ajouter les routes dans votre table de routage que vous avez besoin, comme tout autre itinéraire. Il suffit de leur donner des noms uniques, des URL codées en dur et de les pointer vers le même contrôleur/action. Cela fonctionnera bien. Si vous utilisez un modèle plutôt que des URL codées en dur, assurez-vous que toutes vos routes sont dans le bon ordre afin que la route correcte soit sélectionnée dans la liste. Donc/Aide/Moi devrait apparaître avant/Aide/{Page} si l'itinéraire codé dur va à une page différente du modèle correspondant. Si vous mettez/help/{page} dans le tabel de la route, cela correspondra à/help/me et votre action nommée en dur pour cette route ne se déclenchera jamais. D'un autre côté, s'il s'agit d'un site public et que le référencement est important, soyez prudent si plusieurs URL retournent les mêmes données, elles seront marquées en double. Si c'est le cas, utilisez la balise Canonical, cela donne tout le classement de toutes les URL qui vont à cette seule page à celui que vous nommez et supprime le problème de contenu en double pour vous.

4

Dans mon cas, je cherchais simplement à combiner deux routes «codées» en une seule et suis tombé sur ce post. Je voulais nettoyer un peu mon RouteConfig.cs - parce qu'il y avait tellement de routes similaires.

Je fini par utiliser quelques simples 'ou' logique dans une expression régulière et fondamentalement changé:

routes.MapRoute(
    "UniqueHomePage", 
    "Default", 
    new { controller = "Redirector", action = "RedirectToRoot" } 
); 

routes.MapRoute(
    "UniqueHomePage2", 
    "Home", 
    new { controller = "Redirector", action = "RedirectToRoot" } 
); 

en une seule voie:

routes.MapRoute(
    "UniqueHomePageGeneric", 
    "{url}", 
     new { controller = "Redirector", action = "RedirectToRoot" }, 
     new { url = "Home|Default" } 
); 

Note pour le SEO ou savy -interested : La raison de pointer plusieurs URL vers une même action consiste à les rediriger vers une même page. Dans ce cas, la page d'accueil. L'idée est donc d'éviter les problèmes de contenu en double. Lorsque vous utilisez cette méthode pour pointer des actions NON redirigeant, mais des actions qui affichent leurs propres vues, vous pouvez générer des problèmes de contenu en double: P.

17

Maintenant, dans MVC 5, ceci peut être réalisé en utilisant l'attribut Route.

[Route("Help"/"Me")] 
[Route("Help/Me/Now")] 
[Route("Help/Polemus")] 
[Route("Help/Polemus/Tomorow")] 
public ActionResult Index() 
{ 
    return View(); 
} 
+1

Si vous lisez ceci en 2017 ou plus tard, cette réponse est la voie à suivre.Puis, si vous vous demandez comment déterminer quel chemin vous a amené dans cette méthode d'action, vous pouvez utiliser ControllerContext.RouteData et comparer les URL , [comme expliqué magnifiquement dans cette autre réponse stackoverflow] (http://stackoverflow.com/a/39626076/325521) – Shiva

+3

Afin de faire fonctionner l'attribut d'itinéraire, vous devez également ajouter "rout es.MapMvcAttributeRoutes(); "dans votre fichier RouteConfig.cs avant l'une des autres routes. [MSDN Blog Post] (https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) – joeshmoe301