Определите, к какому порталу следует обращаться в многопользовательском веб-сайте MVC - PullRequest
0 голосов
/ 19 августа 2010

Я работаю над простым мультитенантным приложением MVC2.У меня вопрос, как мне определить, какой портал арендатора запрашивается пользователем в URL?Что мне нужно, чтобы это произошло:

  • Запрос к http://localhost должен перейти на страницу индекса стандартного контроллера дома
  • Запрос к http://localhost/client1 должен перейти на страницу индекса контроллера ClientPortalHome
  • Запрос http://localhost/client1/LogOn перейдет на страницу входа для конкретного клиента

Два приведенных ниже пути достигают этого и, кажется,работают нормально.

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 ]

1 голос
/ 20 августа 2010

Что вы, ребята, думаете о обработчике маршрутов? Каковы плюсы и минусы этого подхода по сравнению с 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);
    }
}
1 голос
/ 19 августа 2010

Это должно работать:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...