2010-08-27 20 views
5

Wie ordne ich mehrere URLs auf die gleiche Aktion in asp.net MvcASP.NET MVC zeigen die mehrere URL auf die gleiche Aktion

ich habe:

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

In meinem global.asax.cs Datei ich all diese uRL auf die folgende Aktion zuordnen möchten:

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

Also ist die Strategie alles, was zu PageController hilft? – Nix

+0

mehr in den Zeilen von ... Ich habe eine Liste von zufälligen URLs, und alle zufälligen URLs müssen die PageController zuordnen. Beachten Sie, dass die Liste bereits definiert ist ... so muss ich im Grunde in einer Schleife durch die Liste und Karte jede URL in dieser Liste auf die Seite Controller –

Antwort

6

Fügen Sie die folgende Zeile in die Routing-Tabelle:

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

das ist fast genau wie das, was ich hatte ... ich Ihr zweites Beispiel versucht jedoch, Wenn ich zu dieser URL navigiere, erhalte ich den Fehler "Ressource kann nicht gefunden werden" und ich habe den zugehörigen "\ Views \ Page \ Index".aspx "view. –

+0

Versuchen Sie meine Bearbeitung. (Ich habe den Namen der Aktion vergessen) – SLaks

+0

hehe, mit der Bearbeitung, es ist jetzt genau das gleiche wie mein erster Versuch :) –

3

Sie können nur die Routen in der Routing-Tabelle hinzufügen, wie Sie sie, wie jede andere Strecke benötigen. Geben Sie ihnen eindeutige Namen und eine fest codierte URL und zeigen Sie sie auf denselben Controller/dieselbe Aktion. Es wird gut funktionieren.

Wenn Sie Muster statt hart codierte URLs passende verwenden nur sicherstellen, dass Sie alle Ihre Routen in der richtigen Reihenfolge erhalten so die richtige aus der Liste ausgewählt ist. So/Help/Me sollte vor/Help/{Page} erscheinen, wenn die fest codierte Route auf eine andere Seite als die mit dem Muster übereinstimmende Route geht. Wenn Sie/help/{page} in der Routen-Tabelle 1 eingeben, wird dies mit/help/me übereinstimmen und Ihre fest codierte benannte Aktion für diese Route würde niemals ausgelöst werden.

Auf einer Seite beachten, wenn diese Seite eine öffentlich zugängliche und SEO ist wichtig, bitte vorsichtig sein, wenn Sie die gleichen Daten zurückkehr mehrere URLs haben, wird es als Duplikat gekennzeichnet sein. Wenn dies der Fall ist, dann verwenden Sie die Canonical Tag, das gibt die ganze Seite Rang von allen URLS, die zum einen auf das einzelne Seite gehen Sie benennen und entfernt den doppelten Inhalt Problem für Sie.

4

In meinem Fall ich war auf der Suche, um einfach zwei "einprogrammierten Routen miteinander zu kombinieren und auf diesem Beitrag gestoßen. Ich wollte meine ein bisschen reinigen - weil es so viele ähnliche Routen hatte.

ich am Ende mit einem paar einfachen 'oder' Logik in einem regulären Ausdruck und grundlegend geändert:

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

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

In einer einzigen Route:

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

Anmerkung für den SEO-savy oder -interested : Der Grund dafür, mehrere URLs auf ein und dieselbe Aktion zu verweisen, besteht darin, sie erneut auf ein und dieselbe Seite umzuleiten. In diesem Fall die Homepage. Die Idee besteht also darin, doppelte Inhalte zu vermeiden. Wenn Sie diese Methode verwenden, um auf NICHT-Umleitungsaktionen zu zeigen, aber Aktionen, die ihre eigenen Ansichten anzeigen, können Sie Probleme mit doppelten Inhalten verursachen: P.

17

Jetzt in MVC 5 kann dies durch die Verwendung Strecke Attribute erreicht werden.

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

Wenn du lesen Sie dies im Jahr 2017 oder später, diese Antwort ist der Weg zu gehen .. Als nächstes, wenn Sie sich wundern, wie 1_ der mehreren Routen Sie in diese Aktion Methode brachte, können Sie 'ControllerContext.RouteData' und vergleichen Sie die URLs , [wie schön in dieser anderen stackoverflow-Antwort erklärt] (http://stackoverflow.com/a/39626076/325521) – Shiva

+3

Um das route-Attribut zum Funktionieren zu bringen, müssen Sie auch "router" hinzufügen es.MapMvcAttributeRoutes(); "in Ihrer RouteConfig.cs-Datei vor den anderen Routen. [MSDN-Blogpost] (https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) – joeshmoe301

Verwandte Themen