1. ホーム
  2. asp.net-mvc

[解決済み] コントローラの基底クラスを使用せずに、すべてのViewにViewBagプロパティを設定するにはどうすればよいですか?

2023-01-01 04:31:24

質問

過去に私は、現在のユーザーのような共通のプロパティを、すべてのコントローラが共通のベースコントローラから継承することによって、グローバルな方法でViewData/ViewBagに貼り付けました。

これにより、私はベースコントローラ上で IoC を使用し、そのようなデータのためにグローバルな共有に手を伸ばさないようにすることができました。

この種のコードを MVC パイプラインに挿入する別の方法があるかどうか、疑問に思っています。

どのように解決するのですか?

私は試していませんが、次のようなものがあります。 ビューを登録する で登録し、アクティベーション時にビューデータを設定します。

ビューはその場で登録されるため、登録構文では Activated イベントへの接続には役立ちませんので、その場合は Module :

class SetViewBagItemsModule : Module
{
    protected override void AttachToComponentRegistration(
        IComponentRegistration registration,
        IComponentRegistry registry)
    {
        if (typeof(WebViewPage).IsAssignableFrom(registration.Activator.LimitType))
        {
            registration.Activated += (s, e) => {
                ((WebViewPage)e.Instance).ViewBag.Global = "global";
            };
        }
    }
}

これは、私の提案する「ハンマーしかない」タイプの提案の1つかもしれません; それを得るための、より簡単なMVC対応方法があるかもしれません。

編集します。 代替の、より少ないコードによるアプローチ - コントローラーにアタッチするだけ

public class SetViewBagItemsModule: Module
{
    protected override void AttachToComponentRegistration(IComponentRegistry cr,
                                                      IComponentRegistration reg)
    {
        Type limitType = reg.Activator.LimitType;
        if (typeof(Controller).IsAssignableFrom(limitType))
        {
            registration.Activated += (s, e) =>
            {
                dynamic viewBag = ((Controller)e.Instance).ViewBag;
                viewBag.Config = e.Context.Resolve<Config>();
                viewBag.Identity = e.Context.Resolve<IIdentity>();
            };
        }
    }
}

2を編集します。 コントローラの登録コードから直接動作する別のアプローチです。

builder.RegisterControllers(asm)
    .OnActivated(e => {
        dynamic viewBag = ((Controller)e.Instance).ViewBag;
        viewBag.Config = e.Context.Resolve<Config>();
        viewBag.Identity = e.Context.Resolve<IIdentity>();
    });