2013-10-03 3 views
3

Я хочу делать вложенные категории .. Нравится;Как я могу отобразить бесконечные вложенные категории на ASP.NET MVC?

Category 1 
    Sub Category 1.1 
     Sub Category 1.1.1 
     .. 
      Sub Category 1.1.1.1.1.1.1.1 
Category 2 
    Sub Category 2.1 
    Sub Category 2.2 
     Sub Categry 2.2.1 
Category 3 

Моя база данных shcema;

enter image description here

Мои ViewModel;

public class CategoriesViewModel 
    { 
     public CategoriesViewModel() 
     { 
      AltGroup = new List<CategoriesViewModel>(); 
     } 

     public int CategoryID { get; set; } 
     public string CategoryName { get; set; }  
     public List<CategoriesViewModel> SubCategories{ get; set; } 
    } 

Моя функция;

private List<CategoriesViewModel> GenerateSub(List<Categories> categories) 
     { 
      List<CategoriesViewModel> categories= new List<CategoriesViewModel>(); 

      foreach (var child in categories) 
      { 
       var subCategories = GenerateChildren(child.Categories1.ToList()); 
       subCategories.Add(new CategoriesViewModel{ CategoryName = child.RoleGroupAdi, SubCategories= subCategories }); 
      } 

      return subCategories; 
     } 

My controller file;

private DbEntities db = new DbEntities(); 
public ActionResult KullaniciYetkiGuncelle(int id = 0) 
     { 
      ViewModel vm = new ViewModdel(); 
      vm.categories = GenerateSub(db.Categories.ToList()); 
      return View(vm); 
     } 

Мой взгляд (я должен изменить его, я знаю);

@foreach (var item in Model.categories) 
{ 
    @item.CategoryName 
    <br /> 
    foreach (var item2 in item.SubCategories) 
    { 
     @item2.CategoryName 
     <br /> 
     foreach (var item3 in item2.SubCategories) 
     { 
      @item3.CategoryName 
      <br /> 
     } 
    } 
} 

И результат; FALSE LISTING

Sub Category 1.1 
Category 1 
    Sub Category 1.1 
    Sub Category 1.2 
     Sub Category 1.2.1 
     Sub Category 1.2.2 
     Sub Category 1.2.3 
Sub Category 1.2 
    Sub Category 1.2.1 
    Sub Category 1.2.2 
    Sub Category 1.2.3 
Sub Category 1.2.1 
Sub Category 1.2.2 
Sub Category 1.2.3 

Но это должно быть; TRUE LISTING

Category 1 
    Sub Category 1.1 
    Sub Category 1.2 
     Sub Category 1.2.1 
     Sub Category 1.2.2 
     Sub Category 1.2.3 

Я делаю ошибку, но я не могу найти, и я не имею представления о представлении.

+0

В чем проблема, вы беспокоитесь о пространстве или скорости? Если это так, вам не нужно извлекать все уровни за один. Вы можете использовать ту же логику «подкачки», которая используется при просмотре длинных таблиц. – NoChance

+0

Какой контроль вы используете для отображения этих записей? –

+0

Извините, ребята, я меняю что-то на свой вопрос .. Проверьте его снова PLS .. – yusuf

ответ

0

Я нашел решение сам:

Когда я добавляю .Where(x => x.ParentCategoryID == null), он возвращает правильный список.

В соответствии с этим, контроллер становится:

private DbEntities db = new DbEntities(); 
public ActionResult KullaniciYetkiGuncelle(int id = 0) 
{ 
    var vm = new ViewModdel(); 
    vm.categories = GenerateSub(db.Categories.Where(x=>x.ParentCategoryID == null).ToList()); 
    return View(vm); 
} 

для просмотра; Проверьте checked answer ..

2

Вы должны сделать его функцию, и вызвать его рекурсивно:

@helper PrintCategories(dynamic categories) 
{ 
    foreach (var item in categories) 
    { 
     @item.CategoryName 
     <br /> 
     var subCategories = item.SubCategories; 
     if (subCategories != null && subCategories.Count > 0) 
     { 
      PrintCategories(subCategories); 
     } 
    } 
} 


@PrintCategories(Model.categories) 
+0

спасибо за ваш ответ, но это onyl для просмотра. Я изменил ваш ответ; Я добавил контроллер .. Потому что в первый раз мне нужно отправить только верхнюю родительскую категорию. – yusuf

+0

Я не совсем понял, что вы редактируете. Если вам нужна одна «корневая» категория, просто замените «категории», которые «rootCategory», и сшивайте вместе. Я понял ваш вопрос, как спросить, как отобразить это в представлении. –

+0

Я добавил эти заголовки к моему вопросу; «FALSE LISTING» и «TRUE LISTING». Если вы снова проверите вопрос, вы можете понять .. Когда я не добавляю «.Where (x => x.ParentCategoryID == null)», этот код возвращает FALSE LISTING .. – yusuf

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