2011-04-10 122 views
0

我有一个扩展方法ASP.NET MVC剃刀 - 拉姆达错误

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

     } 

当我尝试用这种方法类似这样的

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

我得到一个错误“预计”

但是如果我这样做

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

没关系。 (什么是变量“item”?它在哪里定义的?)

为什么第一个示例会引发错误?

回答

3

的一个解决方案是申报剃刀助手这样

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

然后它传递给你的扩展功能

@Model.List(ItemWriter) 

我知道这个代码可以变得更好,但这个工程。主要思想是使用Razor Helpers

2

语法@<tagname>...</tagname>声明了一个lambda表达式,该表达式使用名为item的参数并返回HelperResult

您不能将其作为声明使用;你的第一个例子不能工作。

+0

为什么我的第一个例子不能工作? – Alexandre 2011-04-10 16:45:43

+0

出于同样的原因,您不能像常规语句那样编写'x =>“abc”;'。在Razor中没有办法发布HTML作为嵌入语句;你需要将它用作lambda。 – SLaks 2011-04-10 16:48:19

1

这就是我必须创建Castle.Blade的原因。它支持@ => p ...作为表达式来创建一个名为args的lambda表达式。它也支持嵌套这些声明,而这些声明并不是剃须刀。