2015-06-22 2 views
1

У меня есть два одинаковых сео дружественные маршруты, идущие к различным контроллерам/действия:Дифференциация между MVC Маршруты

routes.MapRoute(
    "Locations", 
    "{controller}/{locationId}/{location}", 
    new { controller = "Locations", action = "Location", location = UrlParameter.Optional }, 
    new { locationId = @"\d+" } 
); 

routes.MapRoute(
    "News", 
    "{controller}/{newsId}/{newsTitle}", 
    new { controller = "News", action = "NewsItem", newsTitle = UrlParameter.Optional }, 
    new { newsId = @"\d+" } 
); 

Маршрут Новости возвращает 404 ошибку, и наоборот, если я поменять их местами. Я попытался добавить контроллер по умолчанию к каждому - это ничего не делало. Затем я попытался заменить {controller} на фактическое имя контроллера. Это генерируется

Согласованный маршрут не включает в себя контроллер «» значение маршрута, который требуется

сообщение об ошибке.

Вот ссылка для каждого:

@Html.ActionLink(x.newsTitle, "NewsItem", "News", new { newsId = x.newsID, newsTitle = x.newsTitle.ToSeoUrl() },null) 

<a href="@Url.Action("Location", "Locations", new { locationId = "1", location = "my-place-name" }, null)"><i class="fa fa-map-marker fa-li red"></i>My Place Name</a> 

Я установил его "путем переключения locationId и расположение элементов строки запроса. ОК, так что это работает, но я считаю, что это неправильное решение. Что делать, если у меня есть третье действие контроллера с аналогичной парой querystring?

Заключительная попытка была сделать маршрут более универсальным:

routes.MapRoute(
    "SEO", 
    "{controller}/{Id}/{Title}", 
    new { Title = UrlParameter.Optional }, 
    new { Id = @"\d+" } 
); 

Bu, то я не могу передать действие, и я вернусь к менее SEO дружественных URL.

В конце концов, я хотел бы закончить с:

  • Расположение/locationId /-топоним моего
  • Новости/NewSID/моя-новости-позиционного

I» m относительно новый для MVC, и я уверен, что мне не хватает чего-то фундаментального (или просто немого).

ответ

1

Проблема в том, что URL-адрес для обоих действий будет соответствовать первому добавляемому вами маршруту. Например, этот URL:

http://yoursite.com/News/123/some-news-article 

будет пытаться вызвать действие Locations в вашем News контроллер, который, очевидно, не существует и дает вам 404 ошибку.

Вы можете обойти это, указав путь в URL-адресе маршрута вместо использования {controller}. Например:

routes.MapRoute(
    "Locations", 
    "Locations/{locationId}/{location}", 
    new { controller = "Locations", action = "Location", location = UrlParameter.Optional }, 
    new { locationId = @"\d+" } 
); 

routes.MapRoute(
    "News", 
    "News/{newsId}/{newsTitle}", 
    new { controller = "News", action = "NewsItem", newsTitle = UrlParameter.Optional }, 
    new { newsId = @"\d+" } 
); 
+0

Fab все работает! Я попытался добавить имя контроллера явно в маршрут, но не добавил его в значения по умолчанию. Так близко, но пока. Спасибо... – ComfortablyNumb

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