如何在mvc 3剃须刀中使用lambda

时间:2012-02-22 10:30:13

标签: razor

我有一些像这样的剃刀代码。


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

但我正在接受这些方面。错误是:

'/'应用程序中的服务器错误。 编译错误 描述:编译服务此请求所需的资源时发生错误。请查看以下特定错误详细信息并适当修改源代码。

Compiler Error Message: CS1002: ; expected

Source Error:

Line 8:          {

Line 9:              @<a>123@(item)</a>

Line 10:         });

Line 11:     }

Line 12: }

如果我用foreach块替换ForEach方法,它运行良好。

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

但我不喜欢foreach,它看起来很难看 如何使用foreach块的ForEach方法实例?

3 个答案:

答案 0 :(得分:2)

@if (Nav != null)
{
    Nav.ForEach(x =>
    {
        Func<object, HelperResult> res = @<a>123@(item)</a>;
        Write(res(x));
    });
}

您确定这看起来比以下更具可读性吗?

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

作为替代方案,您可以使用Razor Delegated helpers

答案 1 :(得分:1)

这是一篇关于在Razor中使用模板化lambda的好文章:http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx

有几个问题。首先,您需要表明您正在lamda中编写HTML,因此您必须在Write上明确调用WriteToHelperResult。此外,由于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);
            }
        });
    }
}

答案 2 :(得分:0)

我认为这是因为你在同一行上放了两个@符号试试

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

跳这有帮助。