2013-08-19 66 views
2

我正在嘗試在asp.net mvc 4中設置多租戶解決方案,其中您可以爲特定控制器指定租戶特定的替代,如果它們需要不同的功能。支持mvc中的多租戶路由

我想有一個像

/{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 }); 

這可以正確處理

  • / - >檢測爲第一路線(!正確的)
  • /首頁 - >檢測爲 第一條路線(正確!)
  • /首頁/ I ndex - >檢測爲第一路線 (正確的!)
  • /客戶端1 /首頁/索引 - 客戶端1被檢測爲控制器 名(不正確)

如果我切換周圍那麼路由租戶路線工作,但基地沒有。

我在這裏錯過了什麼,是否有可能實現這一目標?

請注意,我寧願不必在路由中指定虛擬租戶字符串,因爲稍後我需要在某些需要解析租戶特定信息的地方翻譯該租戶字符串。

+0

這是什麼租戶?它是Action的參數嗎? –

+1

租戶不是一個行動的參數,它只是額外的信息,我可以在mvc管道中的其他地方用於解決租戶特定的依賴關係和視圖等 –

回答

2

您可以使用定義的庫here。如果路由發生衝突,該lib允許您定義替代路由。您必須按如下方式定義路由:

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的空實現。

另請參見其他文章here

+0

看起來很有前途會讓它去 –

+0

代碼的鏈接被打破。有人有副本嗎? – rboarman