2010-08-19 58 views
0

我正在研究簡單的MVC2多租戶應用程序。我的問題是,如何確定用戶在url中要求哪個租戶門戶? 我需要有發生的情況是這樣的:確定在多租戶MVC網站中路由到哪個門戶

以下兩種途徑實現這一目標,似乎很好地工作。

routes.MapRoute(
    "Client Portal Default", // Route name 
    "{clientportal}/{controller}/{action}/{id}", // URL with parameters 
    new { controller = "ClientPortalHome", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults, 
); 

我的問題是我如何確定哪個客戶端門戶已被要求(client1在上面的例子中)?

我嘗試使用這樣的:

private void Application_BeginRequest(Object source, EventArgs e) 
{ 
    var route = RouteTable.Routes.GetRouteData(new HttpContextWrapper(Context)); 
    var currentPortal = route.GetRequiredString("clientportal"); 

    Context.Items.Add("ClientPortalName", currentPortal); 
} 

的問題是,它要求所有路線和拋出異常中家庭控制器的情況下,因爲路線不包含「clientportal」條目。

什麼是最好的方式來確定哪個門戶已被請求,所以我可以確保它存在並顯示客戶端特定的主頁?我需要一個自定義路由處理程序嗎?

預先感謝您。

裏克

+0

爲什麼你需要知道HomeController上的clientportal?有一些客戶特定的內容嗎?我問這,因爲你有一個客戶端特定的HomeController(ClientPortalHome) – davehauser 2010-08-19 17:52:42

+1

我不需要它的HomeController,但我確實需要它爲ClientPortalHomeController和一堆其他控制器。我計劃爲所有客戶端門戶主頁提供一個控制器。是的,我需要從數據庫中提取一些客戶特定的內容並顯示(css,text和jpg)。我編輯了這篇文章,以便更清楚地瞭解錯誤。 – rboarman 2010-08-19 18:35:32

回答

1

這應該工作:

private void Application_BeginRequest(Object source, EventArgs e) 
{ 
    var route = RouteTable.Routes.GetRouteData(new HttpContextWrapper(Context)); 

    object currentPortal; 
    if(route.Values.TryGetValue("clientportal", out currentPortal)) 
    { 
     Context.Items.Add("ClientPortalName", currentPortal); 
    } 
} 
+0

我忘了TryGet!謝謝! – rboarman 2010-08-19 23:15:58

+0

您將如何處理其他控制器 - http:// localhost/about - 此路由加載客戶端端口控制器。 – Neil 2013-08-08 15:18:10

1

你們認爲什麼關於路由處理?這種方法與Application_BeginRequest的優缺點是什麼?

public class PortalRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var portalName = requestContext.RouteData.GetRequiredString("clientportal"); 
     if (!string.IsNullOrWhiteSpace(portalName)) 
     { 
      // Grab the portal details from the database 
      var portalEntity = 
       Repository.For<ClientPortalEntity>().GetAll().Where(x => x.PortalTag == portalName).First(); 
      if (portalEntity != null) 
      { 
       // Register db object for use by controllers 
       IoC.Container.RegisterInstance<ClientPortalEntity>(portalEntity); 
      } 
     } 

     // Return the default MVC HTTP handler for the configured request 
     return new MvcHandler(requestContext); 
    } 
} 
+0

您再次忘記了TryGetValue ... :-) – davehauser 2010-08-19 23:22:23

+0

我在看到您的帖子之前實施了代碼。抱歉!哪種方法更好?另外,如何顯示他們輸入錯誤的門戶名稱的錯誤頁面? – rboarman 2010-08-20 00:15:23

+0

我不確定,哪種解決方案更好...在我看來,他們是相當平等的。我會用第一種方法(global.asax),因爲我把它全部放在一個地方,否則,用第二種方法,問題可能會更好地分離... – davehauser 2010-08-20 10:56:19