首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Razor支持lambda表达式吗?

Razor支持lambda表达式吗?
EN

Stack Overflow用户
提问于 2011-02-08 08:41:31
回答 3查看 13K关注 0票数 18

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

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

代码语言:javascript
复制
@Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            <text> 
                @i.DealerName
            </text>
        }
    }

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

MVCRazor等价物(我想转换成.ASPX语法的代码):

代码语言:javascript
复制
<% Model.ToList().ForEach(i =>
       {
           if (i.DealerName != null)
           { 
           %> <%=i.DealerName%> <%
           };
       }); 
%>

这是用于ASP.NET MVC3随附的剃刀引擎。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-08 09:08:29

您可以使用Response.Write(i.DealerName);而不是<text>@i.DealerName</text>

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

此外,由于ForEach()返回空,因此您必须将其作为代码块放入页面。所以你的代码应该是这样的:

代码语言:javascript
复制
@{
    Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            Response.Write(i.DealerName);
        }
    });
}

更新:如果你有更严重的格式,你可以求助于这个小技巧:

(不幸的是,这里的代码着色不会给这段代码带来任何信任,但如果你把它放到visual studio中,你肯定会明白我的意思。注意:这仅适用于Razor页面,而不适用于代码文件:)

代码语言:javascript
复制
@{
    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));
        }
    });
}

希望这是有意义的:)

票数 11
EN

Stack Overflow用户

发布于 2012-03-06 06:22:05

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

代码语言:javascript
复制
@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>
票数 3
EN

Stack Overflow用户

发布于 2012-09-18 01:19:19

是的,它们是受支持的。但是,Razor有一些奇怪的转义规则,额外的大括号有时会导致它卡住,包括扩展的lambda表达式中的那些。

您可以将@Artiom答案简化一点,去掉那些带有where和select子句的多余大括号

代码语言:javascript
复制
@{
    Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            Response.Write(i.DealerName);
        }
    });
}

变成了

代码语言:javascript
复制
@{
    Model.Where(i=>i.DealerName != null).ToList().ForEach(i =>
    {
            Response.Write(i.DealerName);
    });
}

也可能成为

代码语言:javascript
复制
@{Model.Where(i=>i.DealerName != null).Select(i=>i.DealerName)
    .ToList().ForEach(Response.Write);}

耶,函数式风格!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4928414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档