1

我有一个带有区域的 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的主页中有一个链接,我在其中给出了一个空白区域,我希望它可以在顶部文件夹中(在区域文件夹之外)中找到操作IndexHomeControllerControllers

@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)

由于某种原因,这ActionLink呈现为

~/Area/Controller/Service?action=Index&controller=Home

如果我注释掉 ServiceRoute,同样的ActionLink~/就是我所期望的。

任何想法如何解决此路由问题?我发现的唯一解决方法是改用它:

<a href="@Url.Content("~/")">Home</a>
4

1 回答 1

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

}

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

于 2014-06-12T10:14:55.667 回答