租户区域路线与默认路线

时间:2016-08-19 17:33:28

标签: c# asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas

所以我的网站每个租户基本上都有一个“区域”。因此它将显示为www.site.com/,并将使用某个区域转到该组页面。

事情是我在区域外也有默认路线,因此您可以访问www.site.com/,它将带您进入实际的〜/ Views / Home / Index页面。但是,如果您尝试键入www.site.com/Home/Index或说出创建新组www.site.com/Group/Create的页面,则认为它需要转到不存在的区域并给出无法找到404资源。

这是RouteConfig.cs中的默认路由

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id = UrlParameter.Optional },
             new[] { "TicketSystem.Controllers" }
        );

以下是该区域的路线配置:

        context.MapRoute(
            "Group_default",
            "{group}/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "TicketSystem.Areas.Group.Controllers" }); 

所以{group}是您当前正在访问的任何组,然后它转到该组的常规控制器/操作。但是对于默认路线,无论如何,它似乎仍然会转到区域路线。

我当时认为可能会出现回落。因此,当它试图去该区域并且找不到正确的控制器/动作时,它将检查下一个默认路径。如果它仍然找不到任何东西,它将无法找到404错误资源。虽然我不确定如何做到这一点。

因此,要使www.site.com/工作并允许www.site.com/Home/Index工作。

1 个答案:

答案 0 :(得分:1)

问题是,当您尝试访问public class GroupNameConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { var asm = Assembly.GetExecutingAssembly(); //Get all the controller names var controllerTypes = (from t in asm.GetExportedTypes() where typeof(IController).IsAssignableFrom(t) select t.Name.Replace("Controller", "")); var groupName = values["group"]; if (groupName != null) { if (controllerTypes.Any(x => x.Equals(groupName.ToString(), StringComparison.OrdinalIgnoreCase))) { return false; } } return true; } } 路由引擎不知道" Home" ,你的意思是控制器名称或groupName!

要解决此问题,您可以创建自定义路由约束,以检查请求网址中的组值是否为应用中的有效控制器名称。如果是,则该请求不会被区域路由注册定义处理。

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


        );
    }

注册区域路线时注册此约束。

Bundle name

假设您永远不会拥有与您的控制器名称相同的groupName(例如:Home)

,这应该可行