Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Razor视图中被吞没的扩展方法内的辅助对象的输出_C#_Asp.net Mvc_Asp.net Mvc 4_Razor_Razor 2 - Fatal编程技术网

C# Razor视图中被吞没的扩展方法内的辅助对象的输出

C# Razor视图中被吞没的扩展方法内的辅助对象的输出,c#,asp.net-mvc,asp.net-mvc-4,razor,razor-2,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,Razor 2,从这个问题开始,我一直在尝试以下几点: 使用扩展方法: public static void Each<T>(this IEnumerable<T> ie, Action<T, int> action) { var i = 0; foreach (var e in ie) action(e, i++); } publicstaticvoid-Each(此IEnumerable ie,Action-Act

从这个问题开始,我一直在尝试以下几点:

使用扩展方法:

    public static void Each<T>(this IEnumerable<T> ie, Action<T, int> action)
    {
        var i = 0;
        foreach (var e in ie) action(e, i++);
    }
publicstaticvoid-Each(此IEnumerable ie,Action-Action)
{
var i=0;
foreach(ie中的vare)action(e,i++);
}
使用索引在我的视图中进行迭代,并输出助手方法的结果

            <div class="col-md-12">
                @{ 
                    Model.Take(5).Each((item, n) =>
                    {
                           @RenderItem(item, n == 3);
                    });
                }
           </div

@{ 
模型。取(5)。每个((项目,n)=>
{
@RenderItem(项目,n==3);
});
}

使用此扩展方法,您不会向视图发送任何内容。
@RenderItem
的返回值永远不会发送到视图。Razor helpers是只返回
HelperResult
的函数,但您需要将此
HelperResult
发送到视图。使用
@MyHelper
调用帮助程序时,会呈现
HelperResult
,因为
@
就是这样做的:呈现某些内容

但是,当你在做:

Model.Take(5).Each((item, n) =>
      {
           @RenderItem(item, n == 3);
      });
您只是在呼叫您的助手,但没有向屏幕呈现任何内容(请注意结尾;)。在这种情况下,@不是渲染操作符,只是“转到剃刀”开关。 您可能希望渲染的是
。每个
的输出,但您不能,因为每个都是无效方法

我对您的代码进行了一些处理,只是为了向您展示这些概念。首先,我更改了
Each
方法以返回
IEnumerable

这将调用my
RenderItem
helper,但输出如下(请注意,如果在RenderItem中放置断点,由于延迟调用Linq,断点将不会命中,只需在每次调用force evaluation后添加一个.ToList():

这将按预期工作,您现在正在逐个呈现HelperResult

当然,这段代码只是为了说明Razor模板是如何工作的:)

希望能有帮助

Model.Take(5).Each((item, n) =>
      {
           @RenderItem(item, n == 3);
      });
    public static IEnumerable<HelperResult> Each<T>(this IEnumerable<T> ie, Func<T, HelperResult> action)
    {
        var i = 0;
        foreach (var e in ie) yield return action(e);
    }
 @Enumerable.Range(1, 10).Each(i => @RenderItem(i, i == 3))
WebApplication1.FOo+<Each>d__0`1[System.Int32]
@{
    var x = Enumerable.Range(1, 10).Each(i => @RenderItem(i, i == 3));
    foreach (var ix in x)
    {
        @ix
    }
}