Я создаю простое веб-приложение отчетов для визуализации отчетов с использованием 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 ()
не имеет перегрузки с параметром имени маршрута, означает ли это, что я не могу надежно использовать его где-либо во всем приложении, если у меня есть такой маршрут?