2013-03-22 12 views
5

Używam wprowadzonego przez MVC 3 WebGrid, ale nie mogę nie zastosować własnych metod rozszerzenia podczas przekazywania delegata dla parametru format.Dlaczego nie mogę używać mojej metody rozszerzenia w delegate w Razor WebGrid

Zastosowanie:

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

mam

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

Próbowałem odlewania, że ​​nie będą korzystać

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

Gdybym użyć standardowej metody, to działa:

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

Próbowałem również umieścić rozszerzenie w tej samej przestrzeni nazw, bez wyników.

Jak mogę użyć moich ukochanych rozszerzeń?

Edit: Przestrzeń nazw per se nie jest to problem, przestrzeń nazw, gdzie rozszerzenie jest dostępne dla wszystkich poglądów i klas, i można go używać w tym samym widoku bez problemu. Problem polega na tym, że używasz go w delegacie.

Odpowiedz

2

To nie jest ograniczenie WebGrid lub Razor. Jest to ograniczenie typu C# dynamic. Nie można używać metod rozszerzeń w dynamice. Formant pomocniczy przyjmuje jako argument Func<dynamic, object>, więc parametr item jest typem dynamicznym.

I wrote about this exact issue kilka lat temu.

1

To działa dobrze dla mnie. Klasa statyczna:

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(); 
    } 
} 

Index.cshtml:

@using MvcApplication1.Controllers 

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

Na stronie drukuje:

Hello

Jednak ta wersja Index.cshtml:

@using MvcApplication1.Controllers 

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

Wyświetla komunikat o błędzie:

CS1061: 'string' does not contain a definition for 'MyStringExtension' and no extension method 'MyStringExtension' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)

Podejrzewam, że Jon miał rację i jest to ograniczenie związane z żyletką. (dlaczego działa z HtmlHelperem, pozostawia mnie jednak nieco zakłopotanym)

+0

Znacznie prostszy przykład. Domyślam się, że będę żyć z obejściem :). Dzięki za pomoc. –

0

Znaleziony to SO pytanie w drodze badania dlaczego następujący wiersz został rzuca ten sam błąd:

@a.GetAttribute<ActionLabelAttribute>().ActionLabel 

okazuje się równie dobrze może to być korygowane poprzez zamknięcie tej linii w nawiasach, tak jak poniżej:

@(a.GetAttribute<ActionLabelAttribute>().ActionLabel) 

Uwaga: Metoda rozszerzenia GetAttribute pochodzi z here.

Powiązane problemy