2010-10-22 2 views
0

У меня недавно возникла странная проблема. У меня есть таблица в db с именем Task. Задача может иметь родительскую задачу и несколько дочерних задач (самостоятельное присоединение). я написал хранимую процедуру, которая возвращает мне все задачи в проекте, их дочерние и дочерние дочерние элементы до n уровня, используя CTE (общее табличное выражение). мой требуемый результат следующий: alt textasp.net mvc рендеринг html рекурсивно

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

<table cellspacing="0"> 
    <%foreach (var it in Model.list.Where(x=>x.ParentID == null)) 
     { 
      int x = 1;%> 

     <tr> 
      <td width="150"><div class="wrapper" style="width:18px;">&nbsp;</div><%:it.TOC %></td> 
      <td><%:it.label %></td> 
      <td><%:it.StartDate%></td> 
      <td><%:it.EndDate%></td> 
      <td><%:it.smallDescription %></td> 
     </tr> 
      <%=Model.CallRecursion(it,Model.list,ref x) %> 


    <%} %> 

и можно видеть, что метод вызова рекурсии был определен на модели, которая возвращает HTML-строку рекурсивно. ниже приведен код метода CallRecursion.

public string CallRecursion(TempModel item, List<TempModel> all,ref int count) 
     { 
      if(all.Where(x=>x.ParentID == item.ID).Count() == 0) 
       return ""; 
      else 
      { 
       count++; 
       string retval = "<tr>"; 
       foreach (var kids in all.Where(x => x.ParentID == item.ID)) 
       { 
        retval += "<td><div style='width:"+count*18+"px;' class='wrapper'>&nbsp;</div><span>" + kids.TOC + "</span></td><td>" + kids.label + "</td><td>" + kids.StartDate + "</td><td>" + kids.EndDate+"</td><td>"+kids.smallDescription+"</td></tr>"+ 
         CallRecursion(kids, all,ref count); 
       } 
       count--; 
       return retval; 
      } 


     } 

Мой вопрос: как я могу достичь этой цели более чистым способом. я понятия не имею, могу ли я вызывать частичные представления рекурсивно, чтобы отобразить html, и если да, то какова будет динамика. комментарии и предложения приветствуются.

ответ

1

Почему бы не изменить CTE, чтобы дать вам результаты, как указано ниже, какой уровень в дереве каждой строки. Таким образом, SQL уже выполняет рекурсивные вызовы, поэтому зачем это делать в коде приложения.

Таким образом, ваш метод может быть упрощен, чтобы просто умножить TreeLevel на количество пикселей, чтобы дать правильный отступ. Нет необходимости в рекурсии. Просто пройдите через результирующую модель.

В любом случае, я думаю, вы будете иметь больше значения, имеющие каждый из элементов TreeLevel, потому что вы могли бы сделать другие вещи, как «дать мне обзор всех корневых узлов», приводящих к строкам, где Number равняется 1, 2 и 3

TreeLevel Number Other_data 
0   1  ... 
1   1.1  ... 
1   1.2  ... 
2   1.2.1 ... 
2   1.2.1 ... 
0   2  ... 
1   2.1  ... 
1   2.2  ... 
2   2.1.2 ... 
3   2.1.2.1 ... 
0   3  ... 

Что касается КТР, взглянуть на эту article от 4guysfromrolla, который показывает, как включить значение иерархии (TreeLevel) в качестве части результирующего набора КТР.

Другие примечания относительно вашего исходного кода - используйте классы TagBuilder при построении HTML из кода. ИМО, это будет намного чище и лучше. Нет магических строений ..

+0

@ahmed спасибо за быстрый ответ ур. на самом деле запрос CTE был написан моим боссом, и он не пробовал. позвольте мне спросить, может ли он удобно дать мне уровень дерева в запросе. логически, ваш ответ очень правильный. Я благодарю вас за такой всесторонний ответ –