3

必要に応じて、次のように独自のカスタム View Start を作成しました。

public abstract class MyViewStart : System.Web.Mvc.ViewStartPage {
    public My.Helpers.ThemeHelper Themes { get; private set; }

    public MyViewStart() : base() {
        Themes = new Helpers.ThemeHelper(base.ViewContext)
    }
}

必要なのは、_ViewStart で、テーマに依存するレイアウト ファイルの検索を行う必要があることです。それが行うことは、問題とは無関係です。

私の Views/Shared/_ViewStart.cshtml は次のようになります (無関係なものは削除されています)。

@inherits MyNamespace.MyViewStart
@{
    Layout = Themes.ThemeLayout;
}

したがって、標準の ViewStartPage から派生したカスタム ViewStart クラスがあります。標準の _ViewStart.cshtml は ViewStartPage です。新しい _ViewStart.cshtml は MyViewStart ページであり、これは標準の ViewStartPage であるため、すべてが継承でカバーされます。

ただし、アプリケーションを実行すると、次のエラーが表示されます。

ViewStartPage は、WebViewPage または別の ViewStartPage から派生したページでのみ使用できます。

これは、カスタム ビュー開始クラスのコンストラクターの "Themes = new Helpers.ThemeHelper" 行によってスローされます。では、カスタム ビュー開始クラスが ViewStartPage の子である場合に、なぜその例外がスローされるのでしょうか ???

4

1 に答える 1

3

コンストラクターで ViewContext にアクセスすることはできませんが、ExecutePageHierarchy をオーバーライドすると、そこでアクセスできます。コードを次のように変更して機能させました。

public abstract class MyViewStart : System.Web.Mvc.ViewStartPage {
    public My.Helpers.ThemeHelper Themes { get; private set; }

    public override void ExecutePageHierarchy()
    {
        this.Themes = new Helpers.ThemeHelper(this.ViewContext);
        base.ExecutePageHierarchy();
    }
}
于 2012-06-03T21:20:54.990 に答える