2010-08-27 2 views
5

Как я отобразить несколько URL-адресов на то же действие в ASP.net MVCASP.NET MVC Множественных URL, к тому же действия

У меня есть:

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

В моем Global.asax.cs файл я хочу, чтобы отобразить все эти URL к следующему действию:

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

Так ли стратегия, что-нибудь поможет в PageController? – Nix

+0

больше в строках ... у меня есть список случайных URL-адресов, и все случайные URL-адреса должны сопоставляться с PageController. Обратите внимание, что список уже определен ... так что мне в основном нужно прокручивать список и отображать каждый URL-адрес в этом списке на контроллер страницы –

ответ

6

Добавьте следующую строку в таблицу маршрутизации:

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

, это почти то же, что и у меня ... я попробовал второй пример, однако, при навигации по этому URL-адресу я получаю ошибку «ресурс не найден», и у меня есть связанный «\ Views \ Page \ Index».aspx ". –

+0

Попробуйте мое редактирование. (Я забыл название действия) – SLaks

+0

Хехе, с редактированием, теперь это точно так же, как моя первоначальная попытка :) –

3

Вы можете просто добавить маршруты в таблицу маршрутизации, как вы нуждаетесь в них, так же, как и любой другой маршрут. Просто дайте им уникальные имена, жестко закодированный URL-адрес и укажите их на один и тот же контроллер/действие. Он будет работать нормально.

Если вы используете сопоставление образцов вместо жестко закодированных URL-адресов, просто убедитесь, что вы все маршруты в нужном порядке, поэтому из списка выбран правильный. Так/Help/Me должно появиться перед/Help/{Page}, если жестко закодированный маршрут переместится на другую страницу с соответствующим шаблоном. Если вы поместите/help/{page} в табель маршрута 1, это будет соответствовать/help/me, и ваше жестко закодированное именованное действие для этого маршрута никогда не будет срабатывать.

На стороне примечания, если это публичный сайт и SEO важны, будьте осторожны, если у вас есть несколько URL-адресов, возвращающих одни и те же данные, они будут помечены как дубликаты. Если это так, используйте тег Canonical, это дает весь ранг страницы из всех URL-адресов, которые идут на эту единственную страницу, к тому, который вы назовете, и удаляет проблему дублирования контента для вас.

4

В моем случае я хотел просто объединить два «жестко закодированных» маршрута в один и наткнулся на этот пост. Я хотел немного очистить свой RouteConfig.cs - потому что у него было так много подобных маршрутов.

Я закончил с использованием некоторых простых 'или' логика в регулярном выражении и в основном изменилось:

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

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

В одном маршруте:

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

Примечание для SEO-Savy или -interested : Причина указания нескольких URL-адресов на одно и то же действие, заключается в том, чтобы затем перенаправить их на одну и ту же страницу снова. В этом случае на главной странице. Поэтому идея состоит в том, чтобы предотвратить дублирование контента. Когда вы используете этот метод для указания перенаправления NON-действий, но действия, отображающие их собственные представления, вы можете быть причиной дублирования проблем с содержимым: P.

17

Теперь в MVC 5 это может быть достигнуто с использованием атрибута маршрута.

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

Если вы читают это в 2017 году или позже, этот ответ - это путь. Далее, если вам интересно, как определить, какой 1_ из нескольких маршрутов привел вас в этот метод действий, вы можете использовать 'ControllerContext.RouteData' и сравнить URL-адреса , [как объяснено красиво в этом другом ответе stackoverflow] (http://stackoverflow.com/a/39626076/325521) – Shiva

+3

Чтобы получить атрибут маршрута, вам также нужно добавить «route» es.MapMvcAttributeRoutes(); "в файле RouteConfig.cs перед любым другим маршрутом. [Сообщение о публикации MSDN] (https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) – joeshmoe301

Смежные вопросы