1

MVCアプリケーションのすべてのビューに対して、ログに記録されたユーザーのインスタンス(または、まだ誰もログに記録されていない場合はnull)を提供したいと思います。InvokeActionをオーバーライドし、ログに記録されたユーザーインスタンスをViewData(controllerContext.Controller.ViewData ["LoggedUser"] = xxx)に提供する独自のControllerActionInvokerクラスをすでに正常に実装しました。問題は、アプリケーション全体でログに記録されたユーザーインスタンスを渡すために、強く型付けされたモデルを使用したいということです。私は、強く型付けされたすべてのViewDataクラスの基本クラスであり、ログに記録されたユーザーインスタンスも提供するApplicationViewDataBaseクラスを用意することを考えていました。すべてのビューでログに記録されたユーザーインスタンスに簡単にアクセスできました。

ControllerActionInvoker.InvokeActionオーバーライドで達成したように、強く型付けされたグローバルに入力することは可能ですか?または、Page.Userでユーザーインスタンスを提供する方がよいでしょうか。Page.Userを使用する方がおそらくもっと巧妙だと思いますが、Userインスタンスを挿入する方法も見つかりませんでした...

4

3 に答える 3

1

たぶん、ユーザーをHttpContextに入れるより良い方法はありますか?global.asaxで

protected void Application_AuthenticateRequest(オブジェクト送信者、EventArgs e)

于 2009-03-12T12:14:26.597 に答える
1

これは古い質問なので、将来の訪問者のために、Controller から継承された basecontroller を作成し、OnActionExecuted() を処理してカスタム ユーザー インスタンスをコントローラー アクションとビューの間のビューに追加することで、これを行うことができます。ここにその包括的な実装があります: http://blog.bitdiff.com/2012/05/sharing-common-view-model-data-in.html

そのデータをアクション メソッドで使用できるようにする場合、ビューがまだ存在しないため、状況はもう少し複雑になります。

POST メソッドの場合、「baseView = filterContext.Controller.ViewData.Model as BaseView」でビューにアクセスできますが、ViewData.Model を設定するにはカスタム モデルバインダーが必要です ( https://stackoverflow.com/a/25250058/を参照)。 2381157)。残念ながら、バインドするものがない限りモデルバインダーは呼び出されないため、これはグローバルなソリューションではありません。

適切なアプローチの 1 つは、RouteData または ActionParameters に値を挿入する ActionFilter または AttributeFilter ですが、アクションはこの値をビューに転送する必要があります。

このデータを作成時にビューに挿入するクリーンで簡単な方法を見つけることができず、ユーザー インスタンスのスレッド セーフなキャッシュを実装することに戻り、データベース クエリなしで必要なときにいつでもユーザー インスタンスを取得できるようにしました。オーバーヘッド。これは簡単なことではありませんでしたが、クロスリクエストのユーザー状態を維持するための他の利点がありました (これが、通常、コントローラー ロジックでカスタム ユーザー データを使用できるようにする理由です)。

于 2015-10-14T01:33:09.933 に答える
0

これを追加する必要はありません。ASP.NET MVC では既に利用可能です。ViewContext.HttpContext.User.Identity.Name を見てください。

于 2009-03-12T12:32:24.260 に答える