もともと私はメニュー項目ごとにコード行を繰り返し、さまざまなメニュー項目の値をハードコーディングしましたが、ヘルパーに出くわし、試してみるように教えました。これで、(メニュー項目ごとに)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は、アプリのホームフォルダーを常に指す適切なパスにコンパイルされるのではなく、リテラル文字列として表示されます。
以下は、私が参照用に使用しているリンクです。
具体的には、「RazorDeclarativeHelpers」という見出しの下のページの1/4未満です。ここから。
よろしくお願いします。