Razor支持lambda表达式吗?

时间:2011-02-08 00:41:31

标签: asp.net-mvc lambda razor

Razor视图引擎是否支持lambda表达式/匿名方法?

我在Razor中难以表达以下内容:

@Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            <text> 
                @i.DealerName
            </text>
        }
    }

注意:我知道可以用@foreach来解决这个问题,但我需要一个类似的第三方MVC控件解决方案。它使用此机制来设置控件的内容。它适用于MVC .ASPX视图,但无法使其与Razor一起使用。


MVC .ASPX等价物(我想转换为Razor语法的代码):

<% Model.ToList().ForEach(i =>
       {
           if (i.DealerName != null)
           { 
           %> <%=i.DealerName%> <%
           };
       }); 
%>

这适用于ASP.NET MVC3附带的Razor引擎。

3 个答案:

答案 0 :(得分:11)

您可以使用<text>@i.DealerName</text>

代替Response.Write(i.DealerName);阻止

结果是一样的,就好像你把它放在Razor页面中一样 - 它会在渲染页面时执行..坦率地说 - 我很确定这就是它将被编译成的东西。

此外,由于ForEach()返回void,您必须将其作为代码块放在页面中。 所以你的代码看起来像这样:

@{
    Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            Response.Write(i.DealerName);
        }
    });
}

UPD:如果你有更严肃的格式,你可以诉诸这个漂亮的小技巧:
(不幸的是,这里的代码着色不会给这个片段带来任何好处,但你肯定会看到我的意思,如果你把它放在visual studio中。注意:这只适用于Razor页面,而不是代码文件:))

@{
    Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            Response.Write(((Func<dynamic, object>)(
                @<text>
                    <b>Hello Dealer named: @item.DealerName
                    Multiline support is <em>Beautiful!</em>
                </text>)).Invoke(i));
        }
    });
}

希望有道理:)

答案 1 :(得分:2)

或者,您可以创建一个lambda函数,并为Razor代码正文中的每个项调用它(该想法来自this post中的Andy:

@model IEnumerable<Dealer>

@{
    Func<Dealer, object> sayHi = 
        @<text>
             <b>Hello Dealer named: @(item.DealerName)</b>
             Multiline support is <em>Beautiful!</em>
         </text>;
}

<div>
    @foreach(var dealer in Model.ToList())
    {
        sayHi(dealer);
    }
</div>

答案 2 :(得分:1)

是的,他们受到支持。但是,Razor有一些奇怪的逃避规则,额外的大括号会导致它有时会窒息,包括那些扩展的lambda表达式。

您可以简化@Artioms的回答,删除带有where和可选的select子句的额外大括号

@{
    Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            Response.Write(i.DealerName);
        }
    });
}

变为

@{
    Model.Where(i=>i.DealerName != null).ToList().ForEach(i =>
    {
            Response.Write(i.DealerName);
    });
}

也可以成为

@{Model.Where(i=>i.DealerName != null).Select(i=>i.DealerName)
    .ToList().ForEach(Response.Write);}

Yay功能样式!