5

MVC 3 で導入された WebGrid を使用していますが、パラメーターのデリゲートを渡すときに独自の拡張メソッドを適用できませんformat

使用:

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@item.MyProperty.MyExtensionMethodForString()</span>)

私は得た

ERROR: 'string' does not contain a definition for 'MyExtensionMethodForString'

キャストしようとしましたが、役に立ちませんでした

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@((string)(item.MyProperty).MyExtensionMethodForString())</span>)

標準的な方法を使用すると、次のように機能します。

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@(Utils.MyExtensionMethodForString(item.MyProperty))</span>)

また、拡張機能を同じ名前空間に配置しようとしましたが、結果はありませんでした。

お気に入りの拡張機能を使用するにはどうすればよいですか?

編集:名前空間自体は問題ではなく、すべてのビューとクラスで拡張機能を使用できる名前空間であり、同じビューで問題なく使用できます。問題は、デリゲートで使用する場合です。

4

3 に答える 3

2

これは、WebGrid または Razor の制限ではありません。dynamicこれは C#型の制限です。動的に拡張メソッドを使用することはできません。フォーマット ヘルパーはFunc<dynamic, object>引数として a を取るため、itemパラメーターは動的な型です。

私は数年前にこの正確な問題について書きました。

于 2013-03-26T06:38:15.207 に答える
1

これは私にとってはうまくいきます。静的クラス:

public static class TestExtensions
{
    public static string Foo(this HtmlHelper html, Func<object, HelperResult> func)
    {
        return func(null).ToHtmlString();
    }

    public static string MyStringExtension(this string s)
    {
        return s.ToUpper();
    }
}

インデックス.cshtml:

@using MvcApplication1.Controllers

@Html.Foo(@<text>@Html.Raw("Hello")</text>)

ページは次のように出力されます。

こんにちは

ただし、このバージョンの Index.cshtml:

@using MvcApplication1.Controllers

@Html.Foo(@<text>@("Hello".MyStringExtension())</text>)

エラーメッセージを出力します:

CS1061: 'string' には 'MyStringExtension' の定義が含まれておらず、タイプ 'string' の最初の引数を受け入れる拡張メソッド 'MyStringExtension' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

したがって、ジョンは正しかったと思います。これは、Razor の制限です。(なぜそれが HtmlHelper で動作するのかは、私を少し当惑させます)

于 2013-03-22T22:06:39.993 に答える