私は絶対にすべてのビューのViewModelを作成することなく、ASP.NET MVCのすべてのビューにユーザオブジェクトを提供できますか?すべてのビューにユーザオブジェクトを提供
ASP.NETメンバーシップを使用する場合、プロファイル情報を持つビューにProfile変数が追加されますが、自分自身をロールバックすると、その情報をエクスポートする方法はありません。
私は絶対にすべてのビューのViewModelを作成することなく、ASP.NET MVCのすべてのビューにユーザオブジェクトを提供できますか?すべてのビューにユーザオブジェクトを提供
ASP.NETメンバーシップを使用する場合、プロファイル情報を持つビューにProfile変数が追加されますが、自分自身をロールバックすると、その情報をエクスポートする方法はありません。
コントローラをベースコントローラから継承します。ベースコントローラーで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();
}
ViewModel
クラスをマスターViewModel
のUser
プロパティから継承します。
また、ViewData
コレクションにオブジェクトを渡して、拡張メソッドを使用してビュー内のオブジェクトに簡単にアクセスすることもできます。
1つの代替案をベースViewModel
クラスを持つ、などのViewModelクラスを定義することにすべてのビューに対して、T InnerModel
のようなプロパティを公開する汎用のViewModel<T>
クラスを作成することです。次にFooViewModel
クラスを明示的に作成する必要がなく、ViewModel<Foo>
を渡すことができます。
もちろん、個別に別注のViewModelsが必要な場合は、ViewModel
の基底クラスをそのまま使用し、ViewModel<T>
を持ち、別注のViewModelsを拡張することができます。
ViewData ["UserObject"]を使用するたびにキャストする必要はありませんか? – Pablo
私の回答を更新しました –