ASP.NET MVC、ActionFilter、静的クラス、およびデータの受け渡し
-
03-07-2019 - |
質問
次のシナリオについて、あなたの意見を聞きたいと思います。
何らかのアクションを実行し、何らかの値を出すカスタムActionFilterを定義しました。コントローラーアクションとモデルでその値を使用したいです。
今、TempDataを使用してこの値をActionFilterから任意のコントローラーアクションメソッドに渡し、この値を返されたビューに渡されるすべてのモデルに分配できます。
動作するはずですが、このTempDataはセッション中に存在し、誰も実際にそれを必要としないときです。この値は、1回のリクエストの期間中にコード内で排他的に使用され、その後は事実上無効になります。
2つのオプションがあります:
-
ActionFilterでは、この値をOnActioExecuting()のTempDataに設定し、OnActionExecuted()で削除します。 OnActionExecutedが呼び出され、コントローラーアクションが終了し、応答が既に生成されており、このTempDataコンテンツがセッションに到達していないことを正しく理解していますか?
-
任意のカスタム静的クラス(ロジック)で、この値のパブリックプロパティを定義するだけで、必要なときにいつでも使用します。この静的フィールドは、OnActionExecuting()と実際にコントローラーメソッドを実行する間に失われませんか?サーバーでのリクエスト処理中にこの値を失う可能性がある他の問題はありますか?
まだ検討していない他の/より良いオプションはありますか?
解決
ActionParameters
を使用すると、コードを非常に簡単にテストできることがわかりました。次のようにできます:
// inside your actionfilter
public override void OnActionExecuting(ActionExecutinContext context)
{
var someData = // ... load some data
context.ActionParameters["someData"] = someData;
}
// and then in your action method
[ProvideSomeData]
public ViewResult Index(SomeData someData)
{
// someData will be populated in here
}
他のヒント
re:#2
静的フィールドの問題は、複数のリクエストがすべて同じ静的フィールドを使用するということです。 2つのリクエストを同時に実行している場合、リクエストBがリクエストAの値を上書きする可能性が常にあり、リクエストAのアクションの実行時に間違った値を使用することになります。
リクエスト固有の情報を保持するために静的メンバーを使用することは避けたい。