#c# #asp.net-mvc-3 #conflict #routes
#c# #asp.net-mvc-3 #конфликт #маршруты
Вопрос:
Я уже некоторое время пишу блог как учебный проект, и я только что переписал свою структуру URL, чтобы улучшить организацию моих контроллеров. Все прошло довольно гладко, но у меня небольшая проблема с конфликтующим маршрутом.
Я пытаюсь настроить свою структуру URL следующим образом:
/
/page/2
/category
/category/page/2
Категории хранятся в базе данных. На данный момент это работает нормально, но я только что заметил, что когда я пытаюсь перейти по ссылке на домашнюю страницу, вместо этого она попадает /page
.
Вот моя текущая таблица маршрутов:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Admin",
"admin",
new { controller = "Admin", action = "Index" }
);
routes.MapRoute(
"ShowPagedPostsByCategory",
"{category}/page/{page}",
new { controller = "Posts", action = "Index", page = UrlParameter.Optional },
new { page = @"(d )?" }
);
routes.MapRoute(
"ShowPagedPosts",
"page/{page}",
new { controller = "Posts", action = "Index", page = UrlParameter.Optional },
new { page = @"(d )?" }
);
routes.MapRoute(
"ShowPostsByCategory",
"{category}",
new { controller = "Posts", action = "Index" }
);
routes.MapRoute(
"ShowTaggedPosts",
"posts/tagged/{tag}",
new { controller = "Posts", action = "ShowTaggedPosts", tag = UrlParameter.Optional }
);
routes.MapRoute(
"EditDeleteComment",
"posts/{action}/{id}",
new { controller = "Posts" },
new { action = @"EditComment|DeleteComment", id = @"d " }
);
routes.MapRoute(
"AddComment",
"{controller}/comment",
new { controller = "Posts", action = "Comment" }
);
routes.MapRoute(
"ShowPost",
"{controller}/{PostID}/{*slug}",
new { controller = "Posts", action = "ShowPost", slug = UrlParameter.Optional },
new { PostID = @"d " }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Posts", action = "Index", id = UrlParameter.Optional }
);
}
Я вижу, в чем проблема: домашний URL-адрес ‘/’ совпадает с маршрутом ShowPagedPosts, но перемещение его ниже маршрута по умолчанию кажется неправильным. Это заставляет меня думать, что мой подход к этому немного неправильный. Может кто-нибудь указать мне правильное направление, пожалуйста?
Редактировать: на самом деле, с помощью RouteDebugger я вижу, что он фактически соответствует маршрутам ShowPagedPosts и ShowPostsByCategory.
Ответ №1:
При использовании Html.ActionLink, будет использоваться первый соответствующий маршрут.
Если вы хотите использовать другой конкретный маршрут, используйте Html.RouteLink, который принимает имя маршрута в качестве параметра.
Комментарии:
1. спасибо за ответ. Ваше предложение звучит так, как я хочу, но, похоже, я не могу заставить его работать. На моей
/admin
странице есть ссылка, по которой я хочу перейти на домашнюю страницу. Я пытался использовать@Html.RouteLink("Test", "Default")
для сопоставления с моим маршрутом по умолчанию, но, хотя он отображает ссылку, ссылка href пуста, поэтому она просто возвращает меня/admin
обратно. Мои параметры соответствуют сигнатуре метода, поэтому я не уверен, в чем дело.2. Хорошо, кажется, это небольшая проблема с
Html.RouteLink
(а такжеUrl.RouteUrl
). Найдена и решена проблема из сообщения Скотта Гу здесь . Спасибо за помощь, Арьян. 🙂