以下代码适用于webform视图引擎。
<% Model.Categories.ForEach(x => { %>
<li><a href="#">@x.Name</a></li>
<% }) %>
我在razor视图中编写了以下代码:
@Model.Categories.ForEach(x => {
<li><a href="#">@x.Name</a></li>
})
但这不起作用。
任何人都可以建议,有没有办法在剃须刀视图中实现这一目标?
提前致谢。
答案 0 :(得分:7)
你有什么理由需要这样做吗?
@foreach(var x in Model.Categories) {
<li><a href="#">@x.Name</a></li>
}
上面的内容完全相同,更具惯用性。
我看不到使用Razor语法输出.ForEach()
委托结果的方法。 Razor期望调用方法或调用属性返回一个值,然后将其发送到视图输出中。因为.ForEach()
没有返回任何内容,所以它不知道如何处理它:
无法将类型'void'显式转换为'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>
上定义{{1}的扩展方法包含在此构造中的原始枚举中的项目。
yield
班级:
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; }
}
答案 1 :(得分:5)
感谢您的帮助。我根据Phil Haack的以下文章找到了如何在Razor中实现代理。 Templated Razor Delegates
以下是IEnumerable的扩展代码:
public static HelperResult ForEachTemplate<TEntity>(
this IEnumerable<TEntity> items,
Func<RowEntity<TEntity>, HelperResult> template)
{
return new HelperResult(writer =>
{
var index = 0;
foreach (var item in items)
{
template(new RowEntity<TEntity> {
Index = index,
Value = item }).WriteTo(writer);
index++;
}
});
}
public class RowEntity<TEntity>
{
public int Index { get; set; }
public TEntity Value { get; set; }
}
查看模型是:
// IEnumerable<Person>
public class Person
{
public string Name { get; set; }
}
使用那种扩展方法:
@Model.ForEachTemplate(@<p>Index: @item.Index Name: @Item.Value.Name</p>)