2009-11-16 1 views
0

Я пытаюсь реализовать древовидное представление в своем приложении. Я использую MVC2 Preview 1 и SubSonic 3 SimpleRepository. Я новичок в MVC и Linq.Заполнение списка Childnode: путаница Linq и разделение проблем

Моя проблема в том, что я не уверен, как добавить список дочерних узлов в запись модели, которую я передаю обратно в представление. Так что я добавил IEnumerable назвал ребенок к моей модели классу, который я заселить в действии контроллера:

public class Category 
{ 
    public Category() 
    { 

    } 

    public int ID { get; set; } 
    public int? ParentId { get; set; } 
    [Required(ErrorMessage="Name is required")] 
    public string Name { get; set; } 
    [SubSonicIgnore] 
    public IEnumerable<Category> Children { get; set; } 

} 

Затем в действии контроллера, я тяну все записи и перебирать обновления члена Детей:

public ActionResult Index() 
    { 
     var categories = _repo.All<Category>(); 

     foreach (var c in categories) 
     { 
      c.Children = from p in _repo.All<Category>() 
               where p.ParentId == c.ID 
               orderby p.Name 
               select p; 
     } 
     return View(categories);  
    } 

Мои 2 вопроса: # 1 Почему это не работает? Вне сферы действия цикла мои изменения теряются. # 2 В общем смысле, это правильный подход? Помещение этого кода в контроллер выглядит как взлома.

+0

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

+0

Пройдя через foreach с отладчиком, я вижу, что c.Children получает набор. Однако содержание категорий не меняется. Мой вопрос, почему это не работает? – bq1990

ответ

0

Что касается того, почему это не работает, я подозреваю, что отсроченное исполнение вас достало. Если вы завершите запрос Linq таким образом, как (from ... select p).ToList(), это вызовет оценку запроса.

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

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