c# - How to recursively get categories and their sub categories' sub categories -
i'm trying draw website map follows
<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> the map provider list of postcategory objects
list<postcategory> mapprovider=new list<postcategory>(); ///....mapprovider.add(...); categorymapviewmodel sitemap=new categorymapviewmodel(mapprovider); var map=sitemap.map.tostring(); and postcategory object
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; } } i have written thing doesn't work recursively subcategories of subcategories: example: works sub2 not sub23, sub332, sub....
here categorymapviewmodel class
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; } } am wrong ? can give me best , easiest way ? if yes, please it! kind regards!
the problem searching in categories children, when processing direct children, pass direct children through, when searches sub categories, there none match.
one solution keep reference categories in class , use when searching sub categories.
ie:
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; } } i've taken out few redundant lines also
Comments
Post a Comment