是Razor视图引擎中支持的lambda表达式/匿名方法?
在Razor中,我很难表达以下内容:
@Model.ToList().ForEach(i =>
{
if (i.DealerName != null)
{
<text>
@i.DealerName
</text>
}
}
注意:我知道可以用@foreach
解决这个问题,但我需要一个类似的解决方案来实现第三方MVC控件。它使用此机制来设置控件的内容。它适用于MVC .ASPX视图,但不能与Razor一起使用。
MVCRazor等价物(我想转换成.ASPX语法的代码):
<% Model.ToList().ForEach(i =>
{
if (i.DealerName != null)
{
%> <%=i.DealerName%> <%
};
});
%>
这是用于ASP.NET MVC3随附的剃刀引擎。
发布于 2011-02-08 09:08:29
您可以使用Response.Write(i.DealerName);
而不是<text>@i.DealerName</text>
块
结果是一样的,就像你把它放在一个Razor页面中一样-它将在渲染页面时执行。坦率地说,我非常确定这就是它将被编译成的。
此外,由于ForEach()
返回空,因此您必须将其作为代码块放入页面。所以你的代码应该是这样的:
@{
Model.ToList().ForEach(i =>
{
if (i.DealerName != null)
{
Response.Write(i.DealerName);
}
});
}
更新:如果你有更严重的格式,你可以求助于这个小技巧:
(不幸的是,这里的代码着色不会给这段代码带来任何信任,但如果你把它放到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));
}
});
}
希望这是有意义的:)
发布于 2012-03-06 06:22:05
或者,您可以创建一个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>
发布于 2012-09-18 01:19:19
是的,它们是受支持的。但是,Razor有一些奇怪的转义规则,额外的大括号有时会导致它卡住,包括扩展的lambda表达式中的那些。
您可以将@Artiom答案简化一点,去掉那些带有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);}
耶,函数式风格!
https://stackoverflow.com/questions/4928414
复制相似问题