c# - 在 Razor 中使用 ForEach 扩展

标签 c# asp.net-mvc razor

我正在使用 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/

相关文章:

c# - 处理可能的 IEnumerable 多重枚举警告

asp.net-mvc - ASP.NET MVC - 多态域类和 View 模型

html - 为什么具有 `list-inline` Bootstrap 类的 UL 列表中的元素会换行?

c# - Environment.TickCount 与 DateTime.Now

c# - 我将如何处理 .NET 对象哈希码?

c# - ASP.NET-5 测试库不发现主代码

c# - MVC/n注入(inject) : Implementing My Own ApplicationUserManager

C# 在两个 Web 应用程序之间验证 Web 服务时出现问题

asp.net-mvc - 如何获得过去的Null错误?

asp.net - 如何将参数传递给 ASP.NET MVC 中 ActionLink() 生成的链接?