2011-04-10 9 views
0

J'ai une méthode d'extensionASP.NET MVC Razor - Erreur lambda

public static HelperResult List<T> (this IEnumerable<T> items, Func<T, HelperResult> template) { 

      return new HelperResult(writer =>{ 
       foreach (var item in items) 
        template(item).WriteTo(writer); 
      }); 

     } 

Lorsque je tente d'utiliser cette méthode comme celui-ci

<ol> 
    @Model.List(t=> {@<li>@t.Title</li>}); 
    </ol> 

Je reçois une erreur "attendu"

Mais si je

<ol> 
    @Model.List(@<li>@item.Title</li>) 
    </ol> 

c'est bon. (quelle est la variable "item"? Où la définit-elle?)

Pourquoi le premier exemple génère-t-il une erreur?

Répondre

3

La seule solution est de déclarer aide de rasoir comme ce

@helper ItemWriter(string item) 
{ 
    <li>@item.Title</li> 
} 

Et puis passez ceci à votre fonction d'extension

@Model.List(ItemWriter) 

Je sais que ce code peut être mieux, mais cela fonctionne. L'idée principale est d'utiliser Razor Helpers

2

La syntaxe @<tagname>...</tagname> déclare une expression lambda qui prend un paramètre nommé item et retourne un HelperResult.

Vous ne pouvez pas l'utiliser comme une instruction; votre premier exemple ne peut pas fonctionner.

+0

Pourquoi mon premier exemple ne peut-il pas fonctionner? – Alexandre

+0

Pour la même raison que vous ne pouvez pas écrire 'x =>" abc ";' comme une instruction normale. Il n'y a aucun moyen d'émettre du HTML en tant qu'instruction intégrée dans Razor; vous devez l'utiliser comme un lambda. – SLaks

1

C'est à peu près la raison pour laquelle j'ai dû créer Castle.Blade. Il supporte @ => p ... comme une expression pour créer un lambda avec des arguments nommés. Il prend également en charge l'imbrication de ces déclarations, ce qui n'est pas le cas du rasoir.