2010-08-19 70 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