Пример #1
0
 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);
             }
         }
     }));
 }
Пример #2
0
        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);
                    }
                }
            }));
        }