4

それを継承するカスタム 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 の概念とは異なります。むしろ、「この機能をレイアウトに追加したい」と述べており、レイアウトは、その機能を有効にし、いくつかの場所でそれを有効にする事前定義されたマークアップを出力します。ビューの「機能サポート マークアップまたはスクリプト」を必要とする「ナゲット」が存在する可能性があります。セクションを使用すると、その「共通」スクリプトが複数回表示されますが、これは必要ありません。

そうは言っても、コントローラー内からベース ビュー ページで定義された (カスタム) ヘルパーにアクセスするにはどうすればよいですか?

4

1 に答える 1

2

MVC とよりインラインであるため、代わりにモデルを介して情報を渡すことを検討してください。厳密に型指定されたモデルまたは弱く型指定された ViewBag のいずれかを使用できます (サンプル -コントローラーからビューへのデータの受け渡し)。

コントローラーは、ビューをレンダリングするために使用される正確なページを認識していません。「この名前のビューを見つけて、このデータ(モデル)をレンダリングする」というだけです。異なる条件に応じて同じ名前に一致する異なるビューが存在する可能性があるため、通常、コントローラーからビュー オブジェクトのプロパティを設定する方法はありません。

編集:技術的に非常に難しい理由:

アクション メソッド呼び出し ( ActionResult Index(){...}) の有効期間は、ページ (WebViewPage オブジェクト) の有効期間と交差しません。アクションの実行が完了した後に作成される WebViewPage オブジェクト。したがって、(組み込みのメカニズムではなく) アクションから直接ビュー オブジェクトにデータをプッシュすることに本当に関心がある場合は、コードの一部 (おそらくデリゲートの形式) をビュー作成コードに渡す方法を理解する必要があります。

于 2012-06-01T00:23:53.863 に答える