2013-04-19 7 views
0

Я пытаюсь сделать свой сайт карту следующим образомКак рекурсивно получить категории и подкатегории их подкатегории

<ul> 
     <li>Cat1</li>   
     <li>Cat2     
      <ul class='sub2'>      
       <li>Cat21</li>   
       <li>Cat22</li> 
       <li>Cat23 
         <ul class='sub23'>      
          <li>Cat231</li>   
          <li>Cat232</li> 
          <li>Cat233         
            <ul class='sub233'>      
             <li>Cat2331</li>   
             <li>Cat2332</li> 
             <li>Cat2333</li> 
            </ul> 
          </li> 
         </ul> 
       </li> 
      </ul> 
     </li>  
     <li>Cat3 
      <ul class='sub3'>      
       <li>Cat31</li>   
       <li>Cat32</li> 
       <li>Cat33</li> 
      </ul> 
     </li> 
     <li>Cat4</li> 
</ul> 

поставщиком карты является Список объектов PostCategory

List<PostCategory> MapProvider=new List<PostCategory>(); 
///....MapProvider.add(...); 
CategoryMapViewModel siteMap=new CategoryMapViewModel(MapProvider); 
var map=siteMap.Map.ToString(); 

и объект PostCategory

public class PostCategory{ 
    [Key] 
    public int? CategoryId{get;set;} 

    [StringLength(20/*50*/,MinimumLength=3)] 
    public string Name{get;set;} 

    [StringLength(250)] 
    public string Description { get; set; } 

    //relationship 
    public int? IdPostCategoryParent { get; set; } 
    } 

Я написал некоторые вещи, но он не работает рекурсивно для подкатегорий с ubcategories: например: он работает на sub2, но не для sub23, sub332, суб ....

вот мой CategoryMapViewModel класс

public class CategoryMapViewModel 
{ 
    public HtmlString Map { get; private set; } 
    private List<int?> TakenIds = new List<int?>(); 
    public CategoryMapViewModel(List<PostCategoryModels> categoriesModels) 
    { 
     string map = ""; 
     map = BuildCategoriesMap(categoriesModels, map); 
     this.Map = new HtmlString(map); 
    } 

    private string BuildCategoriesMap(List<PostCategoryModels> categories, string map) 
    { 
     if (categories != null && categories.Count > 0) 
     { 
      map += "<ul>"; 
      foreach (PostCategoryModels cat in categories) 
      { 
       if ((!cat.CategoryId.HasValue) || (cat.CategoryId.HasValue && (!TakenIds.Contains(cat.CategoryId)))) 
       { 
        map += "<li>" + cat.Name; 
        List<PostCategoryModels> subCats = categories.Where(c => c.IdPostCategoryParent == cat.CategoryId).ToList(); 
        if (subCats.Count() > 0) 
        { 
         //map += BuildCategoriesMap(subCats, map); 
         //BuildCategoriesMap(subCats, map); 
         map += BuildCategoriesMap(subCats, ""); 
        } 
        map += "</li>"; 
       } 
       TakenIds.Add(cat.CategoryId); 
      } 
      map += "</ul>"; 
     } 
     return map; 
    } 
} 

я не прав? может ли кто-нибудь дать мне лучший и самый простой способ сделать это? если да, сделайте это! С уважением!

ответ

2

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

Одним из решений является сохранение ссылки на категории в вашем классе и использование этого при поиске подкатегорий.

т.е.

public class CategoryMapViewModel 
{ 
    public HtmlString Map { get; private set; } 
    private List<int?> TakenIds = new List<int?>(); 
    private List<PostCategoryModels> _categories; 

    public CategoryMapViewModel(List<PostCategoryModels> categoriesModels) 
    {  
     _categories = categoriesModels ?? new List<PostCategoryModels>(); 
     string map = BuildCategoriesMap(_categories); 
     this.Map = new HtmlString(map); 
    } 

    private string BuildCategoriesMap(List<PostCategoryModels> categories) 
    { 
     var map = ""; 
     if (categories.Count > 0) 
     { 
      map += "<ul>"; 
      foreach (PostCategoryModels cat in categories) 
      { 
       if ((!cat.CategoryId.HasValue) || (cat.CategoryId.HasValue && (!TakenIds.Contains(cat.CategoryId)))) 
       { 
        map += "<li>" + cat.Name; 
        List<PostCategoryModels> subCats = _categories.Where(c => c.IdPostCategoryParent == cat.CategoryId).ToList(); 
        map += BuildCategoriesMap(subCats); 
        map += "</li>"; 
       } 
       TakenIds.Add(cat.CategoryId); 
      } 
      map += "</ul>"; 
     } 
     return map; 
    } 
} 

Я вынимаю несколько избыточных линии также

+0

youuuupiiii !!!! Yeeeeeeeeeeeeeeeeeeees !!!! Вы правы и сейчас Это работает спасибо Мартин – Bellash

+0

Это удовольствие :) –

Смежные вопросы