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

Asp.net mvc 确定在多租户MVC网站中路由到哪个门户,asp.net-mvc,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 2,我正在开发一个简单的MVC2多租户应用程序。我的问题是如何确定用户在url中请求了哪个租户门户? 我需要做的是: 请求应转到标准主控制器的索引页 对的请求应转到ClientPortalHome控制器的索引页 对的请求将转到特定于客户端的登录页 下面的两种方法可以实现这一点,而且似乎效果不错 routes.MapRoute( "Client Portal Default", // Route name "{clientportal}/{controller}/{action}/

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

  • 请求应转到标准主控制器的索引页
  • 对的请求应转到ClientPortalHome控制器的索引页
  • 对的请求将转到特定于客户端的登录页
下面的两种方法可以实现这一点,而且似乎效果不错

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”条目

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

先谢谢你

里克

这应该是可行的:

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

你们觉得一个路线管理员怎么样?与应用程序需求相比,这种方法的优缺点是什么

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);
    }
}
公共类PortalRouteHandler:IRoutHandler { 公共IHttpHandler GetHttpHandler(RequestContext RequestContext) { var portalName=requestContext.RouteData.GetRequiredString(“clientportal”); 如果(!string.IsNullOrWhiteSpace(portalName)) { //从数据库中获取门户详细信息 无功转移= Repository.For().GetAll().Where(x=>x.PortalTag==portalName.First(); if(可移植性!=null) { //注册数据库对象以供控制器使用 IoC.Container.RegisterInstance(可移植性); } } //返回配置请求的默认MVC HTTP处理程序 返回新的MvcHandler(requestContext); } }
为什么您需要了解HomeController上的clientportal?是否有特定于客户端的内容?我问这个问题,因为您有一个特定于客户端的HomeController(ClientPortalHome),HomeController不需要它,但ClientPortalHomeController和其他一些控制器需要它。我计划为所有客户端门户主页配备一个控制器。是的,我需要从数据库中提取并显示一些特定于客户端的内容(css、文本和jpg)。我编辑这篇文章是为了更清楚地了解错误。我忘记了TryGet!谢谢您将如何处理其他控制器--此路由加载clientportal控制器。您又忘记了TryGetValue…:-)我在看到你的帖子之前实现了代码。很抱歉哪种方法更好?另外,如果输入了错误的门户名称,如何显示错误页面?我不确定,哪种解决方案更好。。。在我看来,他们是相当平等的。我会选择第一种方法(global.asax),因为我把它们都放在一个地方,否则,使用第二种方法,关注点可能会更好地分开…对于第二个问题:您可以使用动作PortalNotFound或类似的东西实现ErrorController。然后签入您的检查,如果portalEntity不为null,则添加一个else子句,并重定向到“/Error/PortalNotFound”。我不确定它是否有效,但您可以尝试直接修改路由值。