Если я правильно понял, пользователи могли одновременно открывать 2 разные вкладки, каждая с другим арендатором. И на каждой странице должны отображаться данные, относящиеся к каждому арендатору.
Таким образом, это означает, что решение, связанное с файлом cookie или сеансом, необходимо отбросить, поскольку арендатор специфичен для каждой вкладки браузера.
И, читая ваш ответ на предложение Сирила Гупты, я понимаю, что скрытый идентификатор tenantId на каждой странице может не отправляться при каждом запросе AJAX. Конечно, одним из решений может быть изменение вашего приложения и обеспечение того, чтобы это всегда имело место с каждым запросом AJAX. В противном случае это также приведет к отбрасыванию глобального фильтра на основе параметров запроса, поскольку tenantId может не всегда присутствовать.
Я думаю, что лучший вариант — добавить сегмент в URL-адрес, содержащий tenantId. Например, заменив маршрут по умолчанию чем-то вроде следующего маршрута (если у вас много разных маршрутов, вам нужно быть очень осторожным, чтобы избежать столкновения маршрутов):
routes.MapRoute(
name: "Default",
url: "{tenant}/{controller}/{action}/{id}",
defaults: new { tenant = "defaultTenant", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Таким образом, вы можете быть уверены, что арендатор всегда будет отправляться по каждому запросу, а также у вас может быть 2 разные вкладки с разными арендаторами, отображающими соответствующие данные.
Существуют различные варианты восстановления значения сегмента маршрута.
Привязка автоматически заполнит значение любого параметра с именем «арендатор» в вашем методе действия или любого параметра с именем «арендатор» в классе модели, который является параметром метода действия: public ActionResult Foo (модель FooModel, строковый арендатор) { //и tenant, и model.tenant будут содержать значение сегмента URL return View(); }
Вы также можете написать фильтр, который обращается к значению параметра маршрута (RouteData — это свойство класса ActionExecutingContext
и ActionExecutedContext
, полученное в качестве параметров методов фильтра), и выполняет некоторую логику. Затем фильтр будет установлен как глобальный фильтр в вашем приложении или на базовом контроллере:
public class FooFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var tenant = filterContext.RouteData.Values["tenant"]
//do whatever you need to do before executing the action, based on the tenant
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var tenant = filterContext.RouteData.Values["tenant"]
//do whatever you need to do after executing the action, based on the tenant
}
}
Последний вариант — получить прямой доступ к параметру RouteData в вашем базовом классе контроллера. (Поскольку RouteData является свойством базового класса MVC Controller
)
Пока вы используете помощники Html и Ajax для создания URL-адресов, клиентский сегмент URL-адреса будет поддерживаться в ваших ссылках. Однако, если у вас есть код jquery, напрямую отправляющий вызовы AJAX с жестко запрограммированными URL-адресами, вам потребуется обновить этот код, чтобы учитывать новый сегмент URL-адреса.
Наконец, если значения tenantId не очень удобны для пользователя, например, целое число, можно задать уникальные имена для каждого арендатора и использовать имена в URL-адресе. Затем вы должны добавить некоторую логику, которая сопоставляет ее с целочисленным значением, необходимым вашему приложению.
person
Daniel J.G.
schedule
23.04.2013