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
:
这将调用myRenderItem
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
}
}