当前位置 : 主页 > 网络编程 > ASP >

asp.net – 如何在razor viewengine中实现foreach委托?

来源:互联网 收集:自由互联 发布时间:2021-06-24
以下代码适用于webform视图引擎. % Model.Categories.ForEach(x = { % lia href="#"@x.Name/a/li% }) % 我在razor视图中编写了以下代码: @Model.Categories.ForEach(x = { lia href="#"@x.Name/a/li}) 但这不起作用. 任何人都
以下代码适用于webform视图引擎.

<% Model.Categories.ForEach(x => { %>
    <li><a href="#">@x.Name</a></li>
<% }) %>

我在razor视图中编写了以下代码:

@Model.Categories.ForEach(x => {
  <li><a href="#">@x.Name</a></li>
})

但这不起作用.

任何人都可以建议,有没有办法在剃刀视图中实现这一点?

提前致谢.

你有什么理由要这么做吗?

@foreach(var x in Model.Categories) {
    <li><a href="#">@x.Name</a></li>
}

上面的内容完全相同,更具惯用性.

我看不到使用Razor语法输出.ForEach()委托结果的方法. Razor期望调用方法或调用属性返回一个值,然后将其发送到视图输出中.因为.ForEach()不返回任何内容,所以它不知道如何处理它:

Cannot explicitly convert type ‘void’ to ‘object’

你可以非常简洁地使用迭代器索引:

@foreach (var item in Model.Categories.Select((cat, i) => new { Item = cat, Index = i })) {
   <li><a href="#">@x.Index - @x.Item.Name</a></li>
}

如果要将其定义为扩展方法而不是匿名类型,则可以创建一个类来保存Item,Index对,并在IEnumerable< T>上定义扩展方法.这将生成包含在此构造中的原始可枚举项中的项.

public static IEnumerable<IndexedItem<T>> WithIndex<T>(this IEnumerable<T> input)
{ 
    int i = 0;
    foreach(T item in input)
        yield return new IndexedItem<T> { Index = i++, Item = item };
}

班级:

public class IndexedItem<T>
{
    public int Index { get; set; }
    public T Item { get; set; }
}

用法:

@foreach(var x in Model.Categories.WithIndex()) {
    <li><a href="#">@x.Index - @x.Item.Name</a></li>
}
网友评论