我正在使用 IEnumerable 扩展来遍历集合并获取其索引:
@Model.ForEach((card, i) => {
@<li class="c@(i)">@card.Text</li>;
})
ForEach 扩展如下:
public static void ForEach<T>(this IEnumerable<T> source, Action<T, Int32> action) {
Int32 i = 0;
foreach (T item in source) {
action(item, i);
i++;
}
} // ForEach
但是当我尝试编译它时,我收到以下错误消息:
Argument 1: cannot convert from 'void' to 'System.Web.WebPages.HelperResult'
我该如何解决这个问题?我需要新的扩展吗?
最佳答案
您的问题是 Razor 期望您的 ForEach
方法返回一个值,例如 MvcHtmlString
。
此外,您不能简单地期望 Razor 翻译您的 foreach 子句的主体以与您的 Action 委托(delegate)一起工作。有一种方法可以让它工作,但它并不那么漂亮。如果您想使用标准的 Razor 语法,我建议使用 James 建议的 @for(...)
子句。
但是,这里有一个有效的实现:
public static MvcHtmlString ForEach<T>(this IEnumerable<T> source, Func<T, Int32, string> selector)
{
return new MvcHtmlString(String.Join("\n", source.Select(selector)));
}
用法:
@Model.ForEach((card, i) =>
{
return "<li class=c" + i + ">" + card.Text + "</li>";
})
关于c# - 在 Razor 中使用 ForEach 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23498283/