2013-03-22 11 views
5

Sto utilizzando il WebGrid introdotto da MVC 3, ma non posso non applicare i miei metodi di estensione quando si passa un delegato per il parametro format.Perché non posso utilizzare il mio metodo di estensione in un delegato in Razor WebGrid

Usando:

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

ho avuto

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

ho provato casting, di non avvalersi

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

Se uso un metodo standard, funziona:

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

Ho anche provato a inserire l'estensione nello stesso spazio dei nomi, senza risultati.

Come posso utilizzare le mie estensioni preferite?

Edit: Lo spazio dei nomi di per sé non è il problema, lo spazio dei nomi in cui l'estensione è disponibile per tutti i punti di vista e le classi, e posso usarlo nella stessa vista senza problemi. Il problema è quando lo si utilizza nel delegato.

risposta

2

Questa non è una limitazione di WebGrid o Razor. È una limitazione del tipo C# dynamic. Non è possibile utilizzare i metodi di estensione su dinamico. L'helper del formato accetta un argomento come Func<dynamic, object>, quindi il parametro item è un tipo dinamico.

I wrote about this exact issue un paio di anni fa.

1

Questo funziona bene per me. classe statica:

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>) 

Viene stampata la pagina fuori:

Hello

Tuttavia, questa versione del Index.cshtml:

@using MvcApplication1.Controllers 

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

Stampa il tuo messaggio di errore:

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?)

Quindi ho il sospetto che Jon avesse ragione e questo è un limite con Rasoio. (perché funziona con HtmlHelper mi lascia un po 'confuso però)

+0

Esempio molto più semplice. Immagino che vivrò con la soluzione :). Grazie per l'aiuto. –

0

trovato questo SO domanda attraverso la ricerca perché la seguente riga stava gettando lo stesso errore:

@a.GetAttribute<ActionLabelAttribute>().ActionLabel 

scopre che potrebbe essere facilmente corretto racchiudendo questa linea tra parentesi, in questo modo:

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

Nota: il metodo di estensione GetAttribute viene fornito da here.

Problemi correlati