ASP.NET MVC中的ServiceRoute区域拦截ActionLink到Home

时间:2012-07-22 13:51:11

标签: asp.net-mvc-3 asp.net-mvc-routing asp.net-mvc-3-areas

我有一个带有区域的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,这是我所期望的。

如何修复此路由问题?我发现的唯一解决方法是使用它:

~/

1 个答案:

答案 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)));

}

这对我们有用,但当然会产生与主项目中的区域相关的代码的开销。