【问题标题】:How can I build a recursive function that builds an MvcHtmlString Breadcrumb trail when I don't know the object beforehand?当我事先不知道对象时,如何构建一个构建 MvcHtmlString 面包屑轨迹的递归函数?
【发布时间】:2010-09-20 21:17:05
【问题描述】:

我相信我需要使用一个使用 lambda 表达式的 html 辅助方法来完成此操作。

我正在考虑按照以下方式做一些事情:

    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/通用方法如何工作?

【问题讨论】:

    标签: c# asp.net asp.net-mvc lambda


    【解决方案1】:

    好吧,我认为您应该考虑将“类别”的递归遍历与面包屑字符串的创建分开。将它们混合在一起,就像您所做的那样,会使代码更难理解和维护.通过分离可能更改的实现部分,您可以使最终结果更容易理解、不那么脆弱和丑陋。

    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() 提供了一种简单的方法来导航到给定对象实例的父对象。如果此代码在运行时发生变化,您可以使用另一个 lambda,或者创建一个接口来统一具有“父级”的不同类型的类。

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

    【讨论】:

    • 哇...我把这个方法弄得太复杂了。
    • @quakkels:很高兴我能帮上忙。有时当你盯着一个问题看太久时,你最终看不到更简单的替代方案。相信我,我一直在同一个地方。 :D
    • 快速提问 - 函数声明应该是 IEnumerable&lt;T&gt; GetHierarchy&lt;T&gt;(etc.etc.) 吗?一般来说,我是使用泛型的新手。当我在函数名后不包含&lt;T&gt; 时,它会告诉我我没有定义“T”。
    • @quakkels:是的。那是一个错字……我会改正的。
    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2013-01-12
    相关资源
    最近更新 更多