我有一个带有区域的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
的{{1}}动作1}}顶部的文件夹(区域文件夹外):
Controllers
出于某种原因,此@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)
呈现为
ActionLink
如果我将ServiceRoute注释掉,则~/Area/Controller/Service?action=Index&controller=Home
指向ActionLink
,这是我所期望的。
如何修复此路由问题?我发现的唯一解决方法是使用它:
~/
答案 0 :(得分:0)
我们遇到了同样的问题。路由注册的顺序似乎是问题,因为来自区域的路由将在来自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)));
}
这对我们有用,但当然会产生与主项目中的区域相关的代码的开销。