ASP.NET MVC 3: решение конфликта маршрутов

#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 ). Найдена и решена проблема из сообщения Скотта Гу здесь . Спасибо за помощь, Арьян. 🙂