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