2011-04-10 137 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表達式。它也支持嵌套這些聲明,而這些聲明並不是剃鬚刀。