在Razor中使用ForEach扩展

Mig*_*ura 5 c# asp.net-mvc razor

我正在使用IEnumerable扩展来遍历集合并获取其索引:

@Model.ForEach((card, i) => {
  @<li class="c@(i)">@card.Text</li>;
})
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译它时,我收到以下错误消息:

参数1:无法从'void'转换为'System.Web.WebPages.HelperResult'

我怎么解决这个问题?我需要新的扩展吗?

Nat*_*n A 5

你的问题是Razor希望你的ForEach方法返回一个值,比如MvcHtmlString.

此外,您不能简单地期望Razor将foreach子句的主体翻译为与您的Action委托一起使用.有一种方法可以使它工作,但它不是那么漂亮.@for(...)如果你想使用标准的剃刀语法,我建议使用James提出的条款.

但是,这是一个有效的实现:

public static MvcHtmlString ForEach<T>(this IEnumerable<T> source, Func<T, Int32, string> selector)
{
    return new MvcHtmlString(String.Join("\n", source.Select(selector)));
}
Run Code Online (Sandbox Code Playgroud)

用法:

@Model.ForEach((card, i) =>
{
    return "<li class=c" + i + ">" + card.Text + "</li>";
})
Run Code Online (Sandbox Code Playgroud)