首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在razor viewengine中实现foreach委托?

如何在razor viewengine中实现foreach委托?
EN

Stack Overflow用户
提问于 2011-02-22 19:02:07
回答 2查看 2.4K关注 0票数 3

以下代码适用于webform视图引擎。

代码语言:javascript
复制
<% Model.Categories.ForEach(x => { %>
    <li><a href="#">@x.Name</a></li>
<% }) %>

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

代码语言:javascript
复制
@Model.Categories.ForEach(x => {
  <li><a href="#">@x.Name</a></li>
})

但这不管用。

有没有人能建议,有没有办法在剃刀视图中实现这一点?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-13 12:44:49

谢谢你的帮助。基于Phil Haack的以下文章,我发现了如何在Razor中实现委托。Templated Razor Delegates

下面是IEnumerable的扩展代码:

代码语言:javascript
复制
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; }
}

查看模型为:

代码语言:javascript
复制
// IEnumerable<Person>

public class Person
{
    public string Name { get; set; }
}

以及该扩展方法的使用:

代码语言:javascript
复制
@Model.ForEachTemplate(@<p>Index: @item.Index Name: @Item.Value.Name</p>)
票数 5
EN

Stack Overflow用户

发布于 2011-02-22 19:06:12

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

代码语言:javascript
复制
@foreach(var x in Model.Categories) {
    <li><a href="#">@x.Name</a></li>
}

上面做的是完全一样的事情,而且更加地道。

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

不能显式地将类型'void‘转换为'object’

你可以让迭代器索引非常简洁,如下所示:

代码语言:javascript
复制
@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>上定义一个扩展方法,该方法yield包装在此构造中的原始enumerable中的项。

代码语言:javascript
复制
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 };
}

类:

代码语言:javascript
复制
public class IndexedItem<T>
{
    public int Index { get; set; }
    public T Item { get; set; }
}

用法:

代码语言:javascript
复制
@foreach(var x in Model.Categories.WithIndex()) {
    <li><a href="#">@x.Index - @x.Item.Name</a></li>
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5077240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档