ASP.NET MVC + WebForms - конфликт маршрута

Я создаю простое веб-приложение отчетов для визуализации отчетов с использованием ASP.NET MVC3 + WebForms. Сами отчеты визуализируются элементом управления ReportViewer ASP.NET WebForms, но я бы хотел использовать ASP.NET MVC для создания записи параметра.

Я бы хотел, чтобы все запросы следовали схеме маршрутизации по умолчанию '~ / {controller} / {action} / {parameters}', за исключением запросов для ~ / Report , которые должны выполняться в отчет отрисовки WebForm. Как правильно это сделать?

Немного расширив ...

У меня есть два маршрута в Global.asax.cs - по умолчанию и один для страницы WebForms.

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

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

    routes.MapPageRoute("report-rendering", "Report", "~/Render.aspx");
}

URL-адреса отображаются нормально, но проблема заключается в том, что при поступлении запроса первый маршрут также использует URL-адреса для второго, т.е. ~ / Report? Id = 7 пытается выполнить вызовите метод Index в ReportController (который не существует).

Если я изменю его так, чтобы маршрут 'report-rendering' предшествовал маршруту 'Default', например:

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

    routes.MapPageRoute("report-rendering", "Report", "~/Render.aspx");

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

Теперь вызовы Html.ActionLink () отображают неправильные URL-адреса, то есть

`@Html.ActionLink("Report list", "Index", "ReportList")`

Renders

`http://localhost:49910/Report?action=Index&controller=ReportList`

] Мой текущий обходной путь сначала ставит маршрут «По умолчанию», добавляя при этом ограничение регулярного выражения для игнорирования запросов к контроллеру «Отчет», например:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    new { controller = @"(?!report$).*" }
);

Это не кажется чистым. Опять же, как это правильно сделать?

Кроме того, я еще не решил, как передать параметры в форму отрисовки: я мог бы использовать оба параметра запроса или отправить их POST. Я предполагаю, что параметры запроса более гибкие. Какая здесь лучшая практика?

РЕДАКТИРОВАТЬ:

Изучая ответ @LeftyX, похоже, что я нашел ответ. Цитируя П. Хаака из его главы «Маршрутизация» в Professional ASP.NET MVC 3 (Именованные маршруты, Глава 9, стр. 233):

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

В упомянутом разделе обсуждается ситуация, очень похожая на описанную мною.

Но поскольку Html.ActionLink () не имеет перегрузки с параметром имени маршрута, означает ли это, что я не могу надежно использовать его где-либо во всем приложении, если у меня есть такой маршрут?

6
задан Ronald Zarīts 1 March 2012 в 14:27
поделиться