1

もともと私はメニュー項目ごとにコード行を繰り返し、さまざまなメニュー項目の値をハードコーディングしましたが、ヘルパーに出くわし、試してみるように教えました。これで、(メニュー項目ごとに)6行のコードが(項目ごとに)1行に減り、5か所で変更するのではなく、1か所で変更を加えることができます。すべての素晴らしいもの。コードは次のとおりです。

@helper MenuItem(string action, string controller)
{
    <a href="@Url.Action(action, controller)" id="@controller">
        <div class="MenuItem">
            <img src="@("/XXX.YYY.Web/Content/Images/Icons/Menu/mnu"+controller+".png")" /><br />
            //I had to put the XXX.YYY as a literal string because the ~ didn't work, it was quoted literally also instead of showing the home folder.
            @controller
        </div>
    </a>
}

私の問題は、インラインで使用すると、たとえば_Layout.cshtmlの先頭で次のコード行を使用して機能することです。

        @MenuItem("Index", "Home")
        @MenuItem("Index", "Chart")

しかし、App_Codeフォルダーの下にあるLayoutHelpers.cshtmlという汎用ヘルパーに削除して再利用できるようにすると、それに応じてコードを次のように変更できます。

        @LayoutHelpers.MenuItem("Index", "Home")
        @LayoutHelpers.MenuItem("Index", "Chart")

注:実際のヘルパーには何も変更されていません。_Layout.cshtmlファイルの上記の2行のみが変更されました。

これらの変更を行うと、次のエラーが発生します。

コンパイルエラーの説明:このリクエストを処理するために必要なリソースのコンパイル中にエラーが発生しました。以下の特定のエラーの詳細を確認し、ソースコードを適切に変更してください。

コンパイラエラーメッセージ:CS0103:名前'Url'は現在のコンテキストに存在しません

ソースエラー:

3行目:@helper MenuItem(string action、string controller)4行目:{5行目:6行目:7行目:@
@

ここで興味深いのは、mnucontroller.pngではなく7行目の「mnuHome.png」でどのように機能するかに注目してください。それでも、5行目はエラーであると書かれています。

〜がヘルパーで機能しないという問題もあります。すなわち。〜/ Contentは、アプリのホームフォルダーを常に指す適切なパスにコンパイルされるのではなく、リテラル文字列として表示されます。

以下は、私が参照用に使用しているリンクです。

http://weblogs.asp.net/jgalloway/archive/2011/03/23/comparing-mvc-3-helpers-using-extension-methods-and-declarative-razor-helper.aspx

具体的には、「RazorDeclarativeHelpers」という見出しの下のページの1/4未満です。ここから。

よろしくお願いします。

4

1 に答える 1

3

標準ヘルパー (UrlHelper や HtmlHelper など) は、Razor inline では使用できません@helper。使用する必要がある場合は、UrlHelper をパラメーターとしてヘルパーに渡す必要があります。

@helper MenuItem(UrlHelper url, string action, string controller)
{
    <a href="@url.Action(action, controller)" id="@controller">
        <div class="MenuItem">
            <img src="@url.Content("~/XXX.YYY.Web/Content/Images/Icons/Menu/mnu"+controller+".png")" />
            <br />
            @controller
        </div>
    </a>
}

そして、呼び出し時に正しいインスタンスを渡します:

@LayoutHelpers.MenuItem(Url, "Index", "Home")
@LayoutHelpers.MenuItem(Url, "Index", "Chart")
于 2013-02-08T11:34:36.403 に答える