代码之家  ›  专栏  ›  技术社区  ›  quakkels

当我事先不知道对象时,如何构建一个递归函数来构建MvcHtmlString Breadcrumb trail?

  •  0
  • quakkels  · 技术社区  · 14 年前

    我想做些类似的事情:

        public static MvcHtmlString GetCategoryBreadCrumbs<T>(
            this HtmlHelper html,
            IEnumerable<T> currentCat,
            Func<T, T> parentProperty,
            Func<T, string> itemContent)
        {
            var sb = new StringBuilder();
            sb.AppendLine(itemContent(currentCat));
            if (currentCat.parentProperty.Count() > 0)
                sb.AppendLine(GetCategoryBreadCrumbs(html, currentCat.parentProperty, itemContent);
    
            return MvcHtmlString.Create(sb.ToString());
        }
    

    然后我想把它叫做类似的:

    <%: Html.GetCategoryBreadCrumbs(
    Model, l => l.parentCategories, 
        l => l.catID, 
        l => l.catName)%>
    

    Lamba/泛型方法是如何工作的?

    1 回复  |  直到 14 年前
        1
  •  3
  •   DiskJunky    7 年前

    public static IEnumerable<T> GetHierarchy<T>( this T item, Func<T,T> getParent )
    {
        while( item != null )
        {
            yield return item;
            item = getParent( item );
        }        
    }
    

    现在你可以用 String.Join() 剩下的事:

    <%: MvcHtmlString.Create(
          string.Join( " >> ", Model.GetHierarchy( item => item.GetParent() )
                                    .Select( item => item.catName ) ) %>
    

    在上面的代码中,我假设 GetParent()

    显然,如果要在多个视图中生成面包屑字符串,应该考虑将其包装到助手中。