2

MVC3 Razor アプリケーション (ASP.NET) でいくつかのカスタム ヘルパーを定義し、カスタム ヘルパーにアクセスしたい ViewStart コードで定義しました。

ViewStart は WebViewPage ではなく ViewStartPage から派生しているため、_ViewStart ではアクセスできないことに気付きました。

そのため、カスタム ViewStart クラスでヘルパーを定義しようとしましたが、ヘルパーを初期化するには ViewDataContainer にアクセスする必要があることがわかりました。

したがって、問題は、ViewStart (またはカスタム ViewStartPage) からカスタム ヘルパーにアクセスするにはどうすればよいか、そうでない場合は、viewDataContainer コンストラクター プロパティを NULL で初期化できるかということです。カスタム ViewStartPage で ViewData アクセスが必要になるとは思いません。

カスタム ViewStart クラスも実装しようとしましたが、次のエラーが発生します。

CustomViewStart does not implement inherited abstract member 'System.Web.WebPages.WebPageExecutingBase.Execute()'

その実行メソッドで何をすべきですか? customViewStart で特別なことをしたくはありません。ヘルパーにアクセスするだけです。

4

2 に答える 2

2

OK、私が推測したように、それは可能であり、最初にいくつかの核心的な技術的詳細を整理する必要がありました.

public abstract class CustomViewStartPage : System.Web.Mvc.ViewStartPage {
    public Helpers.InvariantHelper ConfigHelper { get; private set; }

    public CustomViewStartPage() : base() {
        ConfigHelper = new Helpers.InvariantHelper();
    }
}

ここで、WebViewPage カスタム ベース ページにいくつかのカスタム ヘルパーを定義し、ビューに対してそれぞれの作業を行います。ただし、ViewStart では、ViewContext へのアクセスを必要としない特定の操作 (ここでは簡単な例にすぎません) を実行する必要がありました (当初考えていたように)。

これで、これを _ViewStart.cshtml に含めることができます。

@* Views/_ViewStart.cshtml *@
@inherits MyNamespace.Web.Mvc.CustomViewStartPage
@{
    var something = ConfigHelper.DisableParentLayout;
}

確かに、@MortenMertnerが示したようにクラスの静的メンバーを使用することもできます(外部からの問題の新鮮なビュー)が、場合によっては、それが本当に必要なものではない場合があります。ここでの例は意味がありませんが、必要な人のためにどのように実現できるかを示す目的として役立ちます。

一方、ViewContext にアクセスする必要がある場合 (別の有効なシナリオ)、このカスタム ビューの開始ページを変更してエラーなしでコンテキストにアクセスする方法について説明している上記のコメントの投稿を参照してください。

于 2012-06-04T00:01:27.153 に答える
0

私が理解していることから、_ViewStart ファイルは通常のビューではありません。レイアウト ビューなど、他のビューのデフォルトを設定するためにのみ使用できます。

たとえば、これは私の _ViewStart ファイルの完全な内容です。

@{ Layout = "~/Views/Shared/Layouts/Wide.cshtml"; }

これが当てはまる場合、ファイルにカスタム ヘルパーは不要であり、そもそも解決すべきではない問題を解決しようとしている可能性があります。

余談ですが、アセンブリと名前空間を Web.config に追加して、特定のビューでそれらをインポートする必要がないようにすることができます。これを使用して、モデル、列挙型、および拡張メソッドをインポートします。

于 2012-06-03T17:19:42.377 に答える