public static HelperResult Loop <T>(this HtmlHelper html, IEnumerable <T> items, Func <ListTemplate <T>, HelperResult> template, Func <Template <IEnumerable <T> >, HelperResult> wrapper = null, Func <Template <IEnumerable <T> >, HelperResult> empty = null) { return(new System.Web.WebPages.HelperResult((tw) => { using (var enumerator = items.GetEnumerator()) { if (enumerator.MoveNext()) { var ctx = new ListTemplate <T> { First = true }; Action <TextWriter> renderContents = (tw2) => { while (true) { ctx.Data = enumerator.Current; ctx.Last = !enumerator.MoveNext(); if (ctx.Data is ContentItem) { using (html.Content().BeginContentScope(ctx.Data as ContentItem)) { template(ctx).WriteTo(tw2); } } else { template(ctx).WriteTo(tw2); } if (ctx.Last) { break; } ctx.Index++; } }; if (wrapper != null) { wrapper(new Template <IEnumerable <T> > { Data = items, ContentRenderer = renderContents }).WriteTo(tw); } else { renderContents(tw); } } else if (empty != null) { empty(new Template <IEnumerable <T> > { Data = items }).WriteTo(tw); } } })); }
public static HelperResult Loop <T>(this HtmlHelper html, IEnumerable <T> items, Func <ListTemplate <T>, HelperResult> template, Func <Template <IEnumerable <T> >, HelperResult> wrapper = null, Func <ListTemplate <T>, HelperResult> separator = null, Func <Template <IEnumerable <T> >, HelperResult> empty = null) { return(new HelperResult((tw) => { using (var enumerator = items.GetEnumerator()) { if (enumerator.MoveNext()) { Action <TextWriter> renderContents = (tw2) => { var ctx = new ListTemplate <T> { First = true }; while (true) { ctx.Data = enumerator.Current; ctx.Last = enumerator.MoveNext() == false; template(ctx).WriteTo(tw2); if (ctx.Last) { break; } else if (separator != null) { separator(ctx).WriteTo(tw2); } ctx.Index++; if (ctx.First) { ctx.First = false; } } }; if (wrapper != null) { wrapper(new Template <IEnumerable <T> > { Data = items, ContentRenderer = renderContents }).WriteTo(tw); } else { renderContents(tw); } } else if (empty != null) { empty(new Template <IEnumerable <T> > { Data = items }).WriteTo(tw); } } })); }