13

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のインラインヘルパーは外部変数をキャプチャしないのだろうか?

4

2 に答える 2

9

実際、HelperResultは、ドキュメントで証明されているように、Microsoftが使用したくないものです。

パブリッククラスHelperResult:名前空間System.Web.WebPagesのIHtmlString

概要:このタイプ/メンバーは.NET Frameworkインフラストラクチャをサポートしており、コードから直接使用するためのものではありません。

問題の考えられる解決策は、description関数を別のヘルパーでラップしてから、次のように、そのヘルパーをメソッドグループとしてノードヘルパーに渡すことです。

@helper Node(string title, Func<HelperResult> descriptions)
{
    <div>@descriptions()</div>
}

@helper Description() {
    <span>desc1</span>
    <span>desc2</span>
}

@Node("title", Description)

いずれにせよ、Func型のパラメーターは実際にはパラメーターのない関数と等しいため、最初のアイデアは機能しないはずです。この場合、次のようにラムダ式を記述する必要があります。

myFunction( () => doSomething)

したがって、関数呼び出しは次のようになります。

@node("title", () =>                    
              @<text>
              <span>"desc1"</span>
              <span>"desc2"</span>
              </text>)

ただし、これらのヘルパーの将来は少し疑わしいので、 htmlの小さなスニペットの場合はHtmlHelpersに、大きなチャンクの場合はPartialsに切り替えることを検討します。

于 2013-01-22T19:39:38.047 に答える
3
@Test(new Func<object, HelperResult>[]{@<text>hello</text>})

@Test(new Func<object, HelperResult>[]{@<text>hello</text>,@<text>world</text>})


@helper Test(params Func<object, HelperResult>[] results)
{
    foreach (var result in results)   
    {
        @result(null);
    }
}
于 2014-03-08T09:24:16.613 に答える