2009-11-16 52 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

我不认为你已经清楚什么具体不工作?我同意这个逻辑不应该在控制器中。听起来像存储库应确保模型类正常水合。 – 2009-11-16 22:09:48

+0

通过调试器遍历foreach,我可以看到c.Children被设置。但是,类别的内容不会改变。我的问题是为什么这不起作用? – bq1990 2009-11-17 15:45:12

回答

0

至于为什么它不起作用,我怀疑推迟执行正在让你。如果您将Linq查询包装为(from ... select p).ToList(),则会导致查询被评估。

关于这种方法,它是表示层中的数据访问,所以一般来说,这是可以避免的。