私が正しく理解していれば、それぞれ異なるテナントを持つ2つのタブを同時に開くことができます。各ページには、各テナントに関連するデータが表示されます。
だから、テナントは、各ブラウザタブに固有であるとして廃棄されるクッキーやセッションのニーズを含む溶液を意味します。
Cyril Guptaの提案に対するあなたの答えを読んで、各ページの隠されたテナントIDがAJAXリクエストごとに提出されないことを理解しています。 もちろん、1つの解決策は、アプリケーションを変更して、これが常にすべてのAJAX要求で当てはまることを確認することです。 それ以外の場合は、テナントIDが常に存在するとは限りませんので、リクエストパラメータに基づいてグローバルフィルタも破棄されます。
私は、tenantIdを保持するURLにセグメントを追加することをお勧めします。 (あなたは多くの異なったルートを持っている場合は、ルートの衝突を避けるために非常に注意する必要があるだろう)次のルートのようなもので、デフォルトルートを交換する例を示します。
routes.MapRoute(
name: "Default",
url: "{tenant}/{controller}/{action}/{id}",
defaults: new { tenant = "defaultTenant", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
あなたは確認することができます。この方法でテナント常にますそれぞれの要求に応じて提出することができます。また、適切なデータをそれぞれ表示するテナントの異なる2つのタブを持つこともできます。
ルートセグメントの値を回復する方法にはさまざまなオプションがあります。
バインディングでは、アクションメソッドの "tenant"という名前のパラメータ、またはアクションメソッドのパラメータであるモデルクラスの "tenant"という名前のパラメータに自動的に値が設定されます。public ActionResult Foo(FooModelモデル、文字列テナント) { //テナントとmodel.tenantの両方にURLセグメントの値が含まれます 戻り値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
クラスのプロパティです)
URL生成にHtmlとAjaxヘルパーを使用している限り、URLのテナントセグメントはリンク内で維持されます。しかし、ハードコードされたURLを持つAJAX呼び出しを直接送信するjqueryコードがある場合、新しいURLセグメントが考慮されるようにそのコードを更新する必要があります。
最後に、tenantIdの値が整数のようにユーザーフレンドリーではない場合、テナントごとに一意の名前を付け、URLの名前を使用することができます。アプリケーションに必要な整数値にマップするロジックを追加します。
私はすでに、すべてのコントローラが継承するベースコントローラクラスを持っています。これを使用してフィルタを追加するにはどうすればよいですか?そして確かにそれはActionResultメソッド(フォームのフィールドのどれかをチェックできるのでフォームのサブミットにあります)にのみ影響しますが、JsonResultのものではありません(これらはAJAXサブミットであり、フォームコレクションのオブジェクト) –