【问题标题】:Populating Childnode list: Linq confusion and separation of concerns填充子节点列表:Linq 混淆和关注点分离
【发布时间】:2023-03-20 10:03:02
【问题描述】:

我正在尝试在我的应用程序中实现树视图。我正在使用 MVC2 Preview 1 和 SubSonic 3 SimpleRepository。我是 MVC 和 Linq 的新手。

我的问题是我不确定如何将子节点列表添加到我传递回视图的模型记录中。所以我在我的模型类中添加了一个名为 Children 的 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; }

}

然后在控制器动作中,我提取所有记录并迭代更新 Children 成员:

    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 一般来说,这是正确的方法吗?将此代码放入控制器中感觉就像是 hack。

【问题讨论】:

  • 我认为您不清楚具体是什么不起作用?我同意这个逻辑不应该在控制器中。听起来存储库应该确保模型类正确补水。
  • 使用调试器单步执行 foreach 我可以看到 c.Children 已设置。但是,类别的内容不会改变。我的问题是为什么这不起作用?

标签: asp.net-mvc linq subsonic3


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多