Как я могу создать рекурсивную функцию, которая создает MvcHtmlString Breadcrumb trail, когда я не знаю объект заранее? - PullRequest
0 голосов
/ 21 сентября 2010

Я считаю, что мне нужно использовать вспомогательный метод 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 / Generic?

1 Ответ

3 голосов
/ 21 сентября 2010

Ну, я думаю, вам следует рассмотреть возможность отделения рекурсивного обхода «категорий» от создания строки «хлебных крошек». Смешивание их вместе, как и вы, затрудняет понимание и поддержание кода. Разделяя части реализации, которые могут измениться, вы облегчаете понимание конечного результата, становитесь менее хрупкими и менее уродливыми.

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() предоставляет простой способ перехода к родителю данного экземпляра объекта. Если этот код изменяется во время выполнения, вы можете использовать другую лямбду или создать интерфейс для объединения различных типов классов, имеющих «родителей».

Очевидно, что если вы собираетесь генерировать строку с крошкой в ​​нескольких представлениях, вам следует подумать об этом в помощнике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...