在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图

Posted

技术标签:

【中文标题】在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图【英文标题】:Passing nested data from Controller to View in ASP.Net MVC (LINQ) 【发布时间】:2010-01-15 08:34:01 【问题描述】:

我在 ASP.Net MVC 中使用 LINQ to SQL (SQL Server)。我的页面需要显示所有区域和每个区域内的所有办事处(嵌套)。办公室属于一个郊区,而郊区又属于一个地区。 IE。在每个区域内,我需要在循环中获取属于当前区域的郊区中存在的办公室。

(伪代码)

foreach(Region currentRegion in Regions) 显示区域的标题 foreach(Office currentOffice in all Offices WHICH BELONG TO SUBURBS WHICH BELONG TO THE REGION TO THE REGION) 显示办公室名称

使用 LINQ to SQL 实现这一目标的最简洁的 MVC 范式方法是什么? (我是 SQL 的忠实粉丝,但我在这个项目中使用 LINQ to SQL)。

我不想为了做这么简单的事情而编写 5 个辅助类。我不是在寻找“完美的世界 OO 矫枉过正”的解决方案,干净、简约和简单是最好的。

理想情况下,我希望在 Controller 中组装所有数据,这样我就不会得到一些与 Controller 职责等重叠的混乱视图。

【问题讨论】:

您能否更具体地了解这些数据的格式、保存位置以及检索方式? 【参考方案1】:

在你的情况下,

我会创建视图模型类RegionModelSuburbModelOfficeModel。 使用 AutoMapper,我会将 Region 映射到 RegionModel 并将其传递给视图

视图看起来像这样 (Spark) =>

<viewdata model="RegionModel region" />
<for each="var suburb in region.Suburbs">
    <span each="var office in suburb.Offices">$office.Name</span>
</for>        

这是对“如何传递嵌套数据以在 asp.net-mvc 中查看?”问题的回答。事情是 - 你的模型还不适合这个(区域类不直接与郊区、郊区和办公室绑定)。

所以 - 您需要确保您的区域包含郊区并且郊区包含办公室。我不确定 L2S,但在 nhibernate 中这很容易 - 集合将按原样映射,默认情况下 - 保持延迟加载。 RegionController 将负责正确使用 RegionRepository,RegionRepository 应该提供按需加载郊区和办公室的可能性。

【讨论】:

嗨阿尼斯!谢谢你的回答。虽然我确信 Spark 和 AutoMapper 是很棒的附加组件,但我很想知道在这个阶段如何使用纯/原始 ASP.Net MVC 来完成。在我去学习更多的课程/附加组件等之前,我想首先获得我在这个领域的知识。我发现,你在解决方案中添加的附加组件越多,通常最终会增加维护开销在 2-3 年内,当您的部分解决方案升级时,突然之间,一些附加组件可能不受支持或不再兼容等。 不会有太大变化 - 视图的语法会更加冗长,映射将通过构造函数或对象初始化器创建视图模型来完成。

以上是关于在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.Net Core Mvc 5.0 中将 sql 数据库与 ado.net 连接?

无法在 asp.net mvc 4 中将 JSON 对象映射到 JqGrid

您可以在asp.net mvc中将复杂对象从表单发布到控制器吗

csharp ASP.NET MVC和LINQ

ASP.net MVC LINQ 空引用异常 [重复]

ASP.NET MVC 控制器不会从 LINQ lambda 捕获异常