それを継承するカスタム WebViewPage を使用しているこの MVC3 Razor ASP.NET アプリケーションを構築しています。したがって、すべてのビューでカスタム WebViewPage を使用します。
public class MyCustomWebViewPage : System.Web.Mvc.WebViewPage
{
public CustomHelper MyHelper { get; private set; }
:
}
次に、Views フォルダーにある web.config で、MyCustomViewPage がデフォルトのベース ページであることを示しました。
<system.web.webPages.razor>
<pages pageBaseType="Namespace.MyCustomWebViewPage">
<namespaces>
:
</namespaces>
</pages>
</system.web.webPages.razor>
これまでのところ、View の .cshtml ページで、カミソリ マークアップからカスタム ヘルパーにアクセスできます。
@MyHelper.SomeMethod()
ここで、ヘルパーに対して条件付きで実行する必要があることがあります。CSHTML の @{} スタートアップ セクションでヘルパーのプロパティを設定しようとしましたが、考慮するには遅すぎます。
そのため、呼び出された Action メソッドで行うか、OnActionExecuting() メソッドをオーバーライドして行うことを考えています。
私が抱えている問題は、コントローラーで、次のようなカスタムヘルパーにアクセスする方法が見つからなかったことです。
public class AnyController : Controller {
public ActionResult Index() {
MyHelper.SomeProperty = true;
}
}
もう少し説明すると、アクション (コントローラーのアクション コード) で、特定の機能を有効にするカスタム ヘルパーのプロパティを設定したいという概念です。このようにして、これを必要としないビューではレンダリングされません。コンテンツがビューで定義される @section の概念とは異なります。むしろ、「この機能をレイアウトに追加したい」と述べており、レイアウトは、その機能を有効にし、いくつかの場所でそれを有効にする事前定義されたマークアップを出力します。ビューの「機能サポート マークアップまたはスクリプト」を必要とする「ナゲット」が存在する可能性があります。セクションを使用すると、その「共通」スクリプトが複数回表示されますが、これは必要ありません。
そうは言っても、コントローラー内からベース ビュー ページで定義された (カスタム) ヘルパーにアクセスするにはどうすればよいですか?