2012-02-22 75 views
1

我有一些这样的剃须刀代码。如何在mvc 3剃须刀中使用lambda


@{ 
    Layout = null; 
    var Nav = ViewData["Nav"] as List<string>; 
} 
@{ 
    if(Nav!=null){ 
     Nav.ForEach(item => 
     { 
      @<a>[email protected](item)</a> 
     }); 
    } 
} 

,但我得到这些线路上。错误是:

'/'应用程序中的服务器错误。编辑错误 说明:编译服务此请求所需的资源时出错请查看以下具体的错误细节并适当修改您的源代码。

Compiler Error Message: CS1002: ; expected 

Source Error: 

Line 8:   { 

Line 9:    @<a>[email protected](item)</a> 

Line 10:   }); 

Line 11:  } 

Line 12: } 

如果我用foreach块替换的ForEach方法,它的工作原理好。

foreach (var item in Nav) 
{ 
    <a>@item</a> 
} 

但我不喜欢的foreach,它看起来那么难看。
如何使用ForEach方法instand的foreach块?

回答

0

我想,那是因为你已经把两个@符号在同一行尝试以下

if(Nav!=null){ 
    Nav.ForEach(item => 
    { 
     <a>123 
     @(item) 
     </a> 
    }); 
} 

合这有助于。

+0

对不起,它不起作用。如果删除第一个@符号,剃须刀将以“ 123”作为C#代码。 – peter 2012-02-22 10:51:34

1

下面是使用模板拉姆达在剃刀的好文章:http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx

有几个问题。首先,您需要指出您正在为您的lamda编写HTML,因此您必须明确呼叫HelperResult上的WriteWriteTo。此外,由于您的lambda中的{ }表示块,因此您需要用分号结束所有行。

尝试使用类似Haacked的List扩展:

public static class RazorExtensions { 
    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); 
      } 
     }); 
    } 
}