web-dev-qa-db-ja.com

ASP .NET Core MVC1.0のビューからセッションにアクセスする方法

ビュー内からセッションデータにアクセスしようとしています。

ユースケース:ページの上部に表示されるセッションにステータスメッセージを保存しています。現在、いくつかの_ViewData[....]_プロパティを設定するDisplayMessages()関数を使用し、すべてのコントローラーアクションの開始時に呼び出すことで、これを実装しました。

目標:次のページの読み込み時にメッセージを表示するためにコントローラーに追加のコードを必要とせずに、ステータスメッセージを1回だけ設定したい。

そのため、セッションに保存されているメッセージにビューから直接アクセスしようとしています。

これまで私は以下を試しました:

  • IHttpContextAccessorの依存性注入(ASP .NET Core MVC1.0.0では機能しなくなったようです
  • セッションにアクセスするための静的クラスの作成 コメントで提案されているnext()からnext.invoke()への変更を含む
    • これはうまくいきませんでした。 HttpContextにアクセスでき、_Session.IsAvailable_はtrueでしたが、セッションにデータがありませんでした。
9
FSMaxB

ビューでは次のように機能するはずです。Context.Session.TryGetValue

SessionExtensionsを使用している場合は、Context.Session.GetString 働くでしょう。

20
bvoleti

IHttpContextAccessorの挿入は機能しますが、ASP.NET Core 1.0.0 RC2以降、IHttpContextAcessorは、要求ごとにかなりのパフォーマンスオーバーヘッドがあるため、デフォルトでは登録されません。詳細については、 このGitHubの発表 を参照してください。

トラッチャーの投稿:

IHttpContextAccessorを使用して、現在のスレッドのHttpContextにアクセスできます。ただし、この状態を維持することには重要なパフォーマンスコストがかかるため、デフォルトのサービスセットから削除されました。

これに依存する開発者は、必要に応じて追加し直すことができます:services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

ただし、ユースケースでは、ViewComponentを使用することをお勧めします。これは、コントローラーに依存しない、ロジックを備えた再利用可能なビューです。

ドキュメントは見つけることができます ここ

あなたのビューにあなたは単にそれを埋め込むでしょう

@await Component.InvokeAsync("PriorityList", new { maxPriority = 2, isDone = false })

または

@Component.Invoke("PriorityList", new { maxPriority = 2, isDone = false })

同期呼び出しの場合。

1
Tseng