【问题标题】:Determine which portal to route to in a multi-tenant MVC website在多租户 MVC 网站中确定要路由到哪个门户
【发布时间】:2010-08-19 17:48:36
【问题描述】:

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

下面的两条路线实现了这一点并且似乎工作正常。

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

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

提前谢谢你。

瑞克

【问题讨论】:

  • 为什么需要知道 HomeController 上的客户端门户?是否有一些客户特定的内容?我问这个,因为你有一个特定于客户端的 HomeController (ClientPortalHome)
  • HomeController 不需要它,但 ClientPortalHomeController 和许多其他控制器确实需要它。我计划为所有客户端门户主页设置一个控制器。是的,我需要从数据库中提取并显示一些特定于客户端的内容(css、文本和 jpg)。我编辑了帖子以更清楚地了解错误。

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


【解决方案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);
    }
}

【讨论】:

  • 我忘记了 TryGet!谢谢!
  • 你将如何处理其他控制器 - localhost/about - 此路由加载客户端控制器。
【解决方案2】:

你们如何看待路由处理程序?这种方法与 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);
    }
}

【讨论】:

  • 你又忘记了 TryGetValue... :-)
  • 在看到你的帖子之前我已经实现了代码。对不起!哪种方法更好?另外,如何显示他们输入错误门户名称的错误页面?
  • 我不确定,哪种解决方案更好……在我看来,它们是相当的。我会使用第一种方法(global.asax),因为我将它们都放在一个地方,否则,使用第二种方法,问题可能会更好地分开......
  • 对于第二个问题:您可以使用 PortalNotFound 或类似的操作来实现 ErrorController。然后检查您的检查,如果 portalEntity 不为空,则添加一个带有重定向到“/Error/PortalNotFound”的 else 子句。我不确定它是否有效,但您可以尝试直接修改路由值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多