こんにちはRazor MVC Gurus:面倒なMVCでは、マスターページ、パービジョン、ビューからアクセスできるグローバル変数はどこに置かれますか?
初心者質問です。
背景。私はそれがコントローラ&ビューになる前に、HttpModuleで設定されたカスタムIIdentityを持っています。これを使用するには、私はこの問題は、私は、このような
- マスターレイアウト
- いくつかのサブレベルのネストされたレイアウト
- 一部partialviews など、さまざまな場所でオブジェクトを使用し、ある
MyIdentity myIdentity = (MyIdentity)((GenericPrincipal)context.User).Identity;
MyComplexUser user = myIdentity.User;
//user.name //user.location //user.username //etc
をしなければなりません
実際にはビューが必要とする "MyComplexUser"オブジェクトのどのプロパティのリスト。
現在、ビューでは、プロパティに到達するために、この複雑なキャストを実行する必要があります。たとえば、ユーザーの「名前」が必要な場合は、実行する必要があります。
@(((MyIdentity)((GenericPrincipal)context.User).Identity)。ユーザー))。 )
私はViewBagを使用するために好きではない私はコントローラに入れた後、ViewBag.MyUserプロパティでViewBagを読み込むことができたとしたが、その後
- 。私は強く型付けされたオブジェクトを好む
- 強く型付けされたオブジェクト( "MyUser")をビューに使うと、 "MyUser"プロパティを持つすべてのモデルに人気があります。少し汚れていると感じますか?私のモデルをきれいに保ち、彼らが関与しているビューに特化しているように。しかも、不必要に繰り返してしまう。
- master_layout.cshtmlやpartialviewsのような場所では、コントローラに入れた場合、「MyUser」にどのようにアクセスしますか?
- RenderActionを使用し、各ユーザープロパティの部分ビューをビルドすることは過剰ですか?
ありがとうございます。再び、私はMVC 4の初心者ですが、どんな提案も大変感謝しています。
同様のシナリオがあります。コメントとして投稿します。私が答えとして追加したい場合は、私のすべてのコントローラは、私が書いた 'BaseController'を継承します。この基本クラスでは、 'ExecuteCore'のようなライフサイクルのイベントを配線しました。私はまた、このようなもののためにフィルターを使います。ビュー側では、すべてのビューモデルが 'BaseVM'から継承されます。ここでは、ユーザーにメッセージなどの一般的なプロパティ、ユーザー名などを配置します。 –
@AndreCalil、もう少し説明できますか?ベースコントローラーからベースモデルを取り込むのですか? フィルタを使用する部分が得られません。例を挙げることはできますか? また、基本モデルの共通プロパティに値を設定した場合、マスターレイアウトページでどのように使用しますか? \\ @ Model BaseVMを実行してから、\\ @ Model.UserNameを実行しますか? ありがとう – Liming
あなたは行きます。そして、これは初心者の質問ではないと私は考えています。 –