2011-03-27 66 views
1

下面的代码片段给我一个错误:剃刀:<text></text>内拉姆达

@foreach (PageViewModel root in menuData) 
    { 
     Action <PageViewModel> traverse = null; 
     traverse = (n) => { 
      @<text> 
       <li><a href="@n.Url">@n.Title</a></li> 
      </text> 
      n.Children.ForEach(traverse); 
     }; 
     traverse(root); 
    } 

的错误是:CS1002: ; expected,就在</text>关闭标签后的行。

我在这里做错了什么?

+2

我不认为你需要的文本之前的@ - @''应该是''? – Stuart 2011-03-27 10:29:22

+0

nope,给我一个CS1525:无效的表达术语'<' – 2011-03-27 10:48:45

回答

3

你可以尝试将你的代码片段变成Templated Razor Delegate

基于菲尔哈克的例子,你可以做,看上去像一个帮手:

public static class RazorExtensions 
{ 
    public static HelperResult Traverse(this Action<PageViewMoidel> traverse, 
     Func<T, HelperResult> template) 
    { 
     return new HelperResult(writer => 
     { 
      traverse = (n) => template(n).WriteTo(writer); 
     }); 
    } 
} 

免责声明:我没有测试过这一点,并方便地省略了呼叫n.Children.Foreach为了简化。

+0

谢谢Sergi,就是这样。 – 2011-03-27 11:49:58

+0

@Dänu - 不客气。乐意帮忙=) – 2011-03-27 11:52:25

0

为什么不干脆:

@foreach (var root in menuData) 
{ 
    foreach (var child in root.Children) 
    { 
     <li> 
      <a href="@child.Url">@child.Title</a> 
     </li> 
    } 
} 
+1

OP对使用lambda感兴趣。我相信这个例子只是简化了。 – 2013-01-23 23:19:58