2

我正在尝试在 asp.net mvc 4 中设置多租户解决方案,如果某些控制器需要不同的功能,您可以在其中指定租户特定的覆盖。

我想要这样的路线

/{Controller}/{Action}/{Id}/
/{Tenant}/{Controller}/{Action}/{Id}

如果未指定租户,它应该只匹配第一条路线。

我努力了

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });

            routes.MapRoute(
                name: "Tenant",
                url: "{tenant}/{controller}/{action}/{id}",
                defaults: new { tenant = "", controller = "Home", action = "Index", id = UrlParameter.Optional });

这适用于

  • / -> 检测为第一条路线(正确!)
  • /Home -> 检测为第一条路线(正确!)
  • /Home/Index -> 检测为第一条路线(正确!)
  • /Client1/Home/Index - Client1 被检测为控制器名称(不正确)

如果我切换路线,则租户路线有效,但基本路线无效。

我在这里缺少什么,是否有可能实现这一目标?

请注意,我宁愿不必在路由中指定虚拟租户字符串,因为稍后我必须在需要解析租户特定信息的几个地方将其翻译回来。

4

1 回答 1

2

你可以使用我在这里写的库。如果路由冲突,此库允许您定义替代路由。您必须按如下方式定义路由:

var firstRoute = routes.MapReplaceableRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });    

var secoundRoute = routes.MapRoute(
            name: "Tenant",
            url: "{tenant}/{controller}/{action}/{id}",
            defaults: new { tenant = "", controller = "Home", action = "Index", id = 
UrlParameter.Optional }, lookupParameters: new string[] {"tenant"}, lookupService: new LookupService());

firstRoute.AlternativeRoute  = secondRoute;

对于lookupService,您只需要IRouteValueLookupService 的空实现。

于 2013-08-19T12:48:25.613 回答