Func<>
印刷するHTMLコンテンツを返すaを取り込む必要があるかみそりヘルパーメソッドがあります。これは私が最初に持っていたものです:
@helper node(string title, Func<HelperResult> descriptions)
{
....
<div>@descriptions()</div>
....
}
@node("title",
new Func<HelperResult>(() =>
{
return new HelperResult(
@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>);
}))
残念ながら、これでは私のテキストが印刷されることはありません。エラーもありません。
そこで、インラインヘルパーについて学び、呼び出しメソッドを次のように変更しました。
@node("title",
@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>)
しかし今、私は次のようなコンパイルエラーが発生します
「デリゲート'System.Func'は1つの引数を取りません」。
しかし、私はいかなる議論も受けていません。
したがって、に変更してからFunc<object,HelperResult>
を使用して呼び出すと@descriptions(null)
、次のエラーが発生します。
「最初にデリゲートまたは式ツリー型にキャストせずに、動的にディスパッチされた操作の引数としてラムダ式を使用することはできません」
どこかに問題があると思いますが、それが何であるかはわかりません。
編集:私はその問題を解決したかもしれないと思いますが、それは他のいくつかの問題をもたらします。
私がしたことは、動的メソッドに渡す前にラムダをキャストすることでした。私はそれがエラーが言おうとしていたことだと思います:
@node("title",
((Func<dynamic, HelperResult>)(@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>))
それは機能し、span
タグを正しく印刷します。残念ながら、これを呼び出すときに役に立たないパラメータを渡さなければなりませんFunc
。
今私が抱えている問題は、私の実際の関数が単にいくつかのスパンを書き込むだけではないということです。それはもっとこのようなものです:
@node("title",
((Func<dynamic, HelperResult>)(@<text>
<span>@Helpers.Format(resource.Description,"item")</span>
</text>))
別のヘルパーはどこ@Helpers.Format
にあり、リソースはページモデルの(動的)変数です。
もちろん、これでコードは実行されますが、何も出力されません(<span>
タグ内)。ヘルパー関数内にブレークポイントを設定すると、ブレークポイントがFormat
ヒットし、すべてのパラメーターが正しく設定されているため、正しく出力されない理由がわかりません。同様に、resource.Descriptionに変更しただけでも、何も出力されません。
このコンテキストの外ではうまく機能するので、Razorのインラインヘルパーは外部変数をキャプチャしないのだろうか?