2

以前の投稿で、ヘルパーの使用を開始する方法について質問しました。成功しましたが、この手法を使用しようとすると、1。Html.RenderActionに基づいて別のヘルパーを作成します。2。独自のカスタムヘルパーを渡すと、App_Codeにエクスポートされたときにエラーが発生しました。

繰り返しになりますが、強調するために、これらはインラインで機能しますが、App_Codeにエクスポートされた場合は機能しません。

元のコードは次のとおりです。

私のコードの多くの部分には、次のものしかありません。

    <section class="Box">
        @{ Html.RenderAction("PageOne"); }
    </section>

他の多くの部分にはこれがあります:

@if (@Model.PageTwo)
{
    <section class="Box">
        @{ Html.RenderAction("PageTwo"); }
    </section>
}

したがって、私の最初のステップは、上記のすべてのコードブロックで使用できる次のものをインラインヘルパーに抽出することでした。

@helper Item(HtmlHelper html, string action, string htmlClass)
{
    <section class="@htmlClass">
        @{ html.RenderAction(action); }
    </section>
}

上記のヘルパーを使用すると、上記の最初のコードセグメントのように見えるすべてのコードブロックを次の行に置き換えることができます。

@Item(Html, "PageOne", "Box")

次に、次のような2番目のヘルパーを作成しました。

@helper Item(HtmlHelper html, string action, string htmlClass, bool test)
{
    if (test)
    {
        @Item(html, action, htmlClass)
    }
}

このヘルパーを使用すると、上記の2番目のコードセグメントのように見えるすべてのコードブロックを次の行に置き換えることができます。

@Item(Html, "PageTwo", "Box", @Model.ShowThisTorF)

もう一度私の主な質問は、これはインラインで機能するので、App_Codeに削除するときにどうでしょうか。

App_Codeに移動すると、次のエラーが発生します。最初の問題は、次のコード行を追加するusing参照(HtmlHelperがあいまいなため)の追加に関するものです。

 @using HtmlHelper=System.Web.Mvc.HtmlHelper

これにより最初のエラーが削除されますが、別のエラーが発生します。

System.Web.Mvc.HtmlHelperには「RenderAction」の定義が含まれておらず、「System.Web.Mvc.HtmlHelper」タイプの最初の引数を受け入れる拡張メソッド「RenderAction」が見つかりませんでした(usingディレクティブまたはアセンブリリファレンス?)

他のリファレンスも試しましたが、結果はありません。

 @using HtmlHelper=System.Web.WebPages.Html.HtmlHelper

私が抱えているもう1つの問題は、最初のブロックが機能するようになると、2番目のブロックが機能しないと思うことです。インラインで正常に機能しましたが。

また、私はそれが明白であることを知っています、しかし私がここでそれを言わなければ、誰かが彼らの答えでそれを尋ねるでしょう。それをファイルApp_Codeに移動したとき、実際に必要に応じてファイル名のプレフィックスを追加したので、コードの1行の塊は次のようになりました。

@Helpers.Item(Html, "PageOne", "Box")
@Helpers.Item(Html, "PageTwo", "Box", @Model.ShowThisTorF)

これについて助けてくれてありがとう。

4

1 に答える 1

4

App_Code ディレクトリの正しいHtmlHelper内部ヘルパーは System.Web.Mvc.HtmlHelper.

RenderActionは拡張メソッドであるため、それが宣言されている名前空間に を追加する必要がありますusing@using System.Web.Mvc.Html

したがって、ファイルに名前が付けられHelpers.cshtmlており、App_Code ディレクトリにあると仮定すると、これは機能するはずです。

@using HtmlHelper=System.Web.Mvc.HtmlHelper
@using System.Web.Mvc.Html

@helper Item(HtmlHelper html, string action, string htmlClass)
{
    <section class="@htmlClass">
        @{ html.RenderAction(action); }
    </section>
}
@helper Item(HtmlHelper html, string action, string htmlClass, bool test)
{
    if (test)
    {
        @Item(html, action, htmlClass)
    }
}

そして使用法:

@Helpers.Item(Html, "PageOne", "Box")
@Helpers.Item(Html, "PageTwo", "Box", @Model.ShowThisTorF)
于 2013-02-11T12:01:14.743 に答える