确定在多租户MVC网站中路由到哪个门户

时间:2010-08-19 17:48:36

标签: asp.net-mvc asp.net-mvc-2

我正在开发一个简单的MVC2多租户应用程序。我的问题是如何确定用户在网址中要求哪个租户门户网站? 我需要做的是:

以下两条路线实现了这一目标,似乎工作正常。

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

问题是它被调用所有路由并为Home控制器案例抛出异常,因为该路由不包含“clientportal”条目。

确定哪个门户网站已被请求的最佳方法是什么,以便确保它存在并显示客户端特定的主页?我需要自定义路由处理程序吗?

提前谢谢。

瑞克

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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);
    }
}