2009-08-22 10 views
1

私は絶対にすべてのビューのViewModelを作成することなく、ASP.NET MVCのすべてのビューにユーザオブジェクトを提供できますか?すべてのビューにユーザオブジェクトを提供

ASP.NETメンバーシップを使用する場合、プロファイル情報を持つビューにProfile変数が追加されますが、自分自身をロールバックすると、その情報をエクスポートする方法はありません。

答えて

2

コントローラをベースコントローラから継承します。ベースコントローラーでOnActionExecutingを上書きし、ViewData["UserObject"]をここに設定します。このような何か:

public class YourBaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["UserObject"] = ... 
    } 
} 

それとも、ビューにユーザーオブジェクトを提供するだけで、特定のコントローラをしたい場合は、同じOnActionExecuting方法でカスタムフィルタを作成します。

更新日:

をあなたはViewData["UserObject"]を毎回キャストしたくない場合は、カスタムHTMLヘルパーを作成します。

public static object RenderUserObject(this HtmlHelper html) 
{ 
    return ((html.ViewData["UserObject"] as UserObject) ?? new UserObject()).ToString(); 
} 
+0

ViewData ["UserObject"]を使用するたびにキャストする必要はありませんか? – Pablo

+0

私の回答を更新しました –

0

ViewModelクラスをマスターViewModelUserプロパティから継承します。

また、ViewDataコレクションにオブジェクトを渡して、拡張メソッドを使用してビュー内のオブジェクトに簡単にアクセスすることもできます。

+1

私はまだViewModelsを持っていなければなりません。多くの場合、モデルを使うことができます。多くの場合、モデルは一切必要ありません。 – Pablo

+0

ViewDataを使用すると、私のサイトのあらゆるアクションがプロファイルデータをフェッチしてそこに置く必要があります。繰り返しがたくさんあり、ビューにキャストが大変です。恐ろしいです。 – Pablo

+0

ビューキャストはビューの拡張メソッドで処理されますが、コントローラは各アクションをフェッチする必要があります。 –

0

1つの代替案をベースViewModelクラスを持つ、などのViewModelクラスを定義することにすべてのビューに対して、T InnerModelのようなプロパティを公開する汎用のViewModel<T>クラスを作成することです。次にFooViewModelクラスを明示的に作成する必要がなく、ViewModel<Foo>を渡すことができます。

もちろん、個別に別注のViewModelsが必要な場合は、ViewModelの基底クラスをそのまま使用し、ViewModel<T>を持ち、別注のViewModelsを拡張することができます。

関連する問題