ServiceRoute в ASP.NET MVC с областями перехватывает ActionLink для дома
У меня есть приложение MVC 3 с областями, и я предоставляю сервис из определенной области и контроллера. Маршрутизация к этому сервису определяется внутри AreaRegistration следующим образом
public class AreaAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Area"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.Add(
new ServiceRoute("Area/Controller/Service",
new NinjectServiceHostFactory(), typeof(MyService)));
// ....
}
}
В моем Global.asax.cs
Я определяю только маршрут по умолчанию
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
В моем _Layout.chshtml
У меня есть ссылка на мою домашнюю страницу, где я даю пустую область, и я ожидаю, что она найдет Index
действие в HomeController
в Controllers
Папка вверху (вне папки Области):
@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)
По какой-то причине это ActionLink
отображается как
~/Area/Controller/Service?action=Index&controller=Home
Если я закомментирую ServiceRoute, то же самое ActionLink
указывает на ~/
чего я и ожидаю
Любые идеи, как исправить эту проблему маршрутизации? Единственный обходной путь, который я нашел, состоит в том, чтобы использовать это вместо этого:
<a href="@Url.Content("~/")">Home</a>
1 ответ
У нас была точно такая же проблема. Порядок регистрации маршрутов, по-видимому, является проблемой, так как маршруты из областей будут регистрироваться до маршрутов из кода global.asax.
Чтобы устранить эту проблему, разрешив URL-адрес к службе, а также не нацелив обратную передачу на URL-адрес службы, попробуйте переместить добавление ServiceRoute в Global.asax.cs после регистрации другого маршрута.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
context.Routes.Add(
new ServiceRoute("Area/Controller/Service",
new NinjectServiceHostFactory(), typeof(MyService)));
}
Это сработало для нас, но, конечно, связано с накладными расходами на размещение кода, относящегося к области, в основном проекте.