Wenn ich richtig verstanden habe, könnten Benutzer gleichzeitig zwei verschiedene Registerkarten öffnen, jede mit einem anderen Mandanten. Und jede Seite sollte Daten anzeigen, die für jeden Mandanten relevant sind.
Das bedeutet also, dass eine Lösung mit einem Cookie oder der Sitzung verworfen werden muss, da der Tenant für jede Browser-Registerkarte spezifisch ist.
Und wenn ich Ihre Antwort auf Cyril Guptas Vorschlag lese, verstehe ich, dass die versteckte mententId auf jeder Seite nicht bei jeder AJAX-Anfrage eingereicht werden kann. Eine Lösung könnte natürlich sein, Ihre Anwendung zu modifizieren und sicherzustellen, dass dies bei jeder AJAX-Anfrage immer der Fall ist. Sonst würde das auch einen globalen Filter basierend auf den Anfrageparametern verwerfen, da die mandentId möglicherweise nicht immer da ist.
Ich denke, die beste Option ist dann, ein Segment in der URL hinzuzufügen, die die mandatorId enthält. Zum Beispiel die Standardroute mit so etwas wie die folgende Route zu ersetzen (Wenn Sie viele verschiedene Wege sein müssen Sie müssten Route Kollision sehr vorsichtig vermeiden): Sie können die Mieter machen kann, wird immer darauf geachtet werden
routes.MapRoute(
name: "Default",
url: "{tenant}/{controller}/{action}/{id}",
defaults: new { tenant = "defaultTenant", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Auf diese Weise bei jeder Anfrage eingereicht werden, und Sie könnten auch 2 verschiedene Registerkarten mit verschiedenen Mandanten haben, die jeweils die entsprechenden Daten anzeigen.
Es gibt verschiedene Möglichkeiten, den Wert des Routensegments wiederherzustellen.
den Wert füllt automatisch auf jedem Parameter mit dem Namen „Mieter“ auf der Aktionsmethode Der Bindung wird oder über den Parameter „Mieter“ in einer Modellklasse mit dem Namen, der ein Parameter der Aktionsmethode ist: public Action Foo (FooModel Modell , Zeichenfolgenmandant) { // Sowohl mandant als auch model.tenant enthalten den Wert des URL-Segments return View(); }
Sie auch einen Filter schreiben könnte, die den Wert der Route Parameter zugreifen (Routedata ist eine Eigenschaft der Klasse ActionExecutingContext
und ActionExecutedContext
als Parameter der Filtermethoden erhalten), und eine gewisse Logik durchführt.
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
}
}
Die letzte Option ist, um direkt die Routedata-Parameter auf Basis Controller-Klasse zugreifen: Der Filter würde dann als globale Filter in Ihrer Anwendung oder auf Ihren Basisregler eingestellt wird. (Da RouteData eine Eigenschaft der Basisklasse MVC Controller
ist)
Solange Sie HTML- und Ajax-Helfer für die URL-Generierung verwenden, wird das Tenant-Segment der URL in Ihren Links beibehalten. Wenn Sie jedoch jQuery-Code haben, der direkt AJAX-Aufrufe mit fest codierten URLs sendet, müssten Sie diesen Code aktualisieren, damit das neue URL-Segment berücksichtigt wird.
Wenn die mentId-Werte etwas nicht sehr benutzerfreundliches wie eine Ganzzahl sind, könnten Sie eindeutige Namen für jeden Mandanten haben und die Namen in der URL verwenden. Sie fügen dann eine Logik hinzu, die den Integer-Wert Ihrer Anwendung abbildet.
Ich habe bereits eine Basis-Controller-Klasse, von der alle Controller erben. Wie kann ich damit einen Filter hinzufügen? Und das würde sicherlich nur ActionResult-Methoden betreffen (sie stammen aus Formularübergaben, so dass ich jedes der Formularfelder überprüfen kann), aber nicht JsonResult (weil diese AJAX-Submits sind und nur die tatsächlich übergebenen Felder enthalten, nicht das gesamte Formularsammlungsobjekt)) –