MVC MapPageRoute и ActionLink - PullRequest
       4

MVC MapPageRoute и ActionLink

9 голосов
/ 14 декабря 2010

Я создал маршрут страницы, чтобы я мог интегрировать свое приложение MVC с несколькими страницами веб-форм, которые существуют в моем проекте:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // register the report routes
    routes.MapPageRoute("ReportTest",
        "reports/test",
        "~/WebForms/Test.aspx"
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    );
}

Это создает проблему всякий раз, когда я использую Html.ActionLink в своих представлениях:

<%: Html.ActionLink("Home", "Index", "Home") %>

Когда я загружаю страницу в браузере, ссылка выглядит так:

http://localhost:12345/reports/test?action=Index&controller=Home

Кто-нибудь сталкивался с этим раньше? Как я могу это исправить?

Ответы [ 2 ]

5 голосов
/ 10 февраля 2013

У меня просто была очень похожая проблема.Мое решение состояло в том, чтобы дать системе маршрутизации причину отклонить маршрут страницы при поиске совпадений для ActionLink.

В частности, в сгенерированном URL вы можете видеть, что ActionLink создает два параметра: контроллер и действие.Мы можем использовать их в качестве метода, чтобы наши «стандартные» маршруты (~ / controller / action / id) не соответствовали маршруту страницы.

Заменив статические «отчеты» в маршруте страницы параметром, который мыМы назовем «контроллер», а затем добавим ограничение, что «контроллер» должен быть «сообщает», мы получаем тот же маршрут страницы для наших отчетов, но отклоняем что-либо с параметром контроллера, который не «сообщает».

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // register the report routes
    // the second RouteValueDictionary sets the constraint that {controller} = "reports"
    routes.MapPageRoute("ReportTest",
        "{controller}/test",
        "~/WebForms/test.aspx",
        false,
        new RouteValueDictionary(),
        new RouteValueDictionary { { "controller", "reports"} });

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    );
}
5 голосов
/ 15 декабря 2010

Полагаю, вам нужно добавить некоторые параметры в объявление MapPageRoute.Так что, если у вас есть более одной страницы веб-форм в каталоге WebForms, это работает хорошо.

routes.MapPageRoute  ("ReportTest",
                      "reports/{pagename}",
                      "~/WebForms/{pagename}.aspx");

PS: Вы также можете захотеть взглянуть на свойство RouteExistingFiles RouteCollection

Альтернативой будет использование

<%=Html.RouteLink("Home","Default", new {controller = "Home", action = "Index"})%>
...