2010-08-27 23 views
5

Jak mogę mapować wiele adresów URL do tego samego działania w ASP.NET MVCASP.NET MVC Multiple URL do tego samego działania

mam:

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

W moim Global.asax.cs złożyć chcę odwzorować wszystkie te url na następujące działania:

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

Czy strategia jest pomocna dla programu PageController? – Nix

+0

more in the lines ... Mam listę losowych adresów URL, a wszystkie losowe adresy URL muszą być odwzorowane na PageController. Zauważ, że lista jest już zdefiniowana ... więc w zasadzie muszę przechodzić przez listę i mapować każdy adres URL na tej liście do kontrolera stron –

Odpowiedz

6

dodać następujący wiersz do tabeli routingu:

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

to prawie dokładnie to, co miałem ... Próbowałem twojego drugiego przykładu, jednak podczas nawigacji do tego adresu URL pojawia się błąd "nie można znaleźć zasobu" i mam skojarzony "\ Views \ Page \ Index.aspx "view. –

+0

Spróbuj mojej edycji. (Zapomniałem nazwy akcji) – SLaks

+0

hehe, z edycją, jest teraz dokładnie taka sama jak moja pierwsza próba :) –

3

Można tylko dodać trasy do tabeli tras jak ich potrzebujesz, tak samo jak każdy inny trasie. Po prostu daj im unikalne nazwy, zakodowany adres URL i skieruj go do tego samego kontrolera/akcji. Będzie działać dobrze.

Jeśli używasz dopasowywania do wzorca zamiast adresów URL z twardym kodowaniem, upewnij się, że wszystkie trasy są we właściwej kolejności, więc wybrana z listy jest właściwa. Tak więc/Help/Me powinien pojawić się przed/Help/{Page}, jeśli trasa jest zakodowana na innej stronie niż dopasowany wzorzec. Jeśli umieścisz/help/{page} w pierwszym planie trasy, będzie to pasowało do/help/me, a twoje zakodowane na stałe nazwane działanie dla tej trasy nigdy nie wystrzeli.

Na marginesie, jeśli jest to witryna skierowana na stronę publiczną, a SEO jest ważne, należy zachować ostrożność, jeśli masz wiele adresów URL zwracających te same dane, zostanie oznaczony jako duplikat. W takim przypadku należy użyć znacznika Canonical, co daje cały ranking stron od wszystkich adresów URL, które trafiają na tę jedną stronę do tej, którą wymieniasz i usuwa problem duplikatów treści.

4

W moim przypadku chciałem po prostu połączyć dwie "zakodowane" trasy w jedną i natknąłem się na ten post. Chciałem trochę posprzątać mój RouteConfig.cs - ponieważ miał on wiele podobnych tras.

skończyło się stosując kilka prostych 'lub' logika w wyrażeniu regularnym i zasadniczo zmieniło:

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

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

w jednej trasie:

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

Uwaga dla SEO-Savy lub -interested : Powodem wskazania wielu adresów URL na jedno i to samo działanie jest ponowne przekierowanie ich na tę samą stronę. W tym przypadku strona główna. Pomysł polega więc na zapobieganiu zduplikowanym problemom z treścią. Gdy używasz tej metody do wskazywania NON przekierowań, ale działań, które pokazują własne widoki, możesz być PRZYCZYNĄ zduplikowanych problemów z treścią: P.

17

Teraz w MVC 5 można to osiągnąć, stosując atrybut trasy.

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

czytają to w 2017 lub później, ta odpowiedź jest drogą do zrobienia Następnie, jeśli zastanawiasz się, jak określić, co 1_ z wielu tras doprowadziło cię do tej Metody Akcji, możesz użyć 'ControllerContext.RouteData' i porównać adresy URL , [jak pięknie wyjaśniono w tej innej odpowiedzi na stackoverflow] (http://stackoverflow.com/a/39626076/325521) – Shiva

+3

Aby atrybut trasy działał, musisz także dodać "routing" es.MapMvcAttributeRoutes(); "w pliku RouteConfig.cs przed innymi trasami. [Post w blogu MSDN] (https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) – joeshmoe301

Powiązane problemy