ASP.NET MVC区域路由不使用默认路由

时间:2012-04-06 12:14:57

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

我正在尝试将我的MVC项目分成多个区域。所以我有3个方面1)crm 2)服务3)Web。我希望PublicWeb成为我的默认版。这意味着它应该被访问,如www.mysitename.com/mycontroller/myaction(中间没有区域名称)和其他两个用区域名称访问(www.mysitename.com/crm/mycontroller/myaction)。我应该有什么路由/区域配置?我尝试了AreaRegistration.RegisterAllAreas();,它仅适用于我的默认设置(网络)。当我访问其他2时,它引发了404错误。

我试图像下面的那样注册

        var area2reg = new crmAreaRegistration();
        var area2context = new AreaRegistrationContext(area2reg.AreaName, RouteTable.Routes);
        area2reg.RegisterArea(area2context);

        var area1reg = new webAreaRegistration();
        var area1context = new AreaRegistrationContext(area1reg.AreaName, RouteTable.Routes);
        area1reg.RegisterArea(area1context);

然后我的公共网络工作。但是,当我访问我的论坛时,它抛出了这个错误,

  

发现多个类型与名为“home”的控制器匹配。如果为此请求提供服务的路由('crm / {controller} / {action} / {id}')未指定名称空间来搜索与请求匹配的控制器,则会发生这种情况。如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由。

web的我的RegisterArea函数是这个

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "web_default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }

        );
    }

crm 的那个是

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "crm_default",
            "crm/{controller}/{action}/{id}",
            new { controller = "home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

我该如何处理?

2 个答案:

答案 0 :(得分:2)

从我所看到的区域路线看起来很好。您是否更新了Global.asax中的默认路由以将请求发送到Web区域?

类似的东西:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}",
            new { area = "web", controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

    }

答案 1 :(得分:1)

我认为Jonathan S的解决方案绝对值得一试,但您可能会考虑采用不同的方法。那就是将您的web文件放在默认位置。当没有区域是请求的一部分时,路由引擎不会在区域中查找这些文件。