在 MVC 3 中渲染复杂视图
Posted
技术标签:
【中文标题】在 MVC 3 中渲染复杂视图【英文标题】:Rendering a Complex View in MVC 3 【发布时间】:2011-10-28 14:42:04 【问题描述】:我有一个包含三个表的数据库:A、B 和 C。
我希望视图以特定方式呈现数据。遍历 A,然后在 A 下列出 B 的行,其中 B.aID = A.ID,在 B 的每一行下列出 C 的每一行,其中 C.bId = B.ID。
我是 ASP.NET MVC3 的新手,我不确定如何完成此操作。我看到的所有例子都是直截了当的。
【问题讨论】:
【参考方案1】:我将从添加三个模型开始:A、B 和 C。在这些模型中,A 包含 B 的列表,B 包含 C 的列表。出于测试目的,我还会添加一些东西来唯一标识它们,例如名称。示例:
public class A
public string Name get; set;
public List<B> Bs get; set;
public class B
public string Name get; set;
public List<C> Cs get; set;
public class C
public string Name get; set;
在我的控制器中,我将添加一个用数据填充这些模型的操作方法。出于测试目的,我使用的是虚拟数据。
public ActionResult List()
C c1 = new C() Name = "C1" ;
C c2 = new C() Name = "C2" ;
C c3 = new C() Name = "C3" ;
C c4 = new C() Name = "C4" ;
B b1 = new B() Name = "B1", Cs = new List<C>() c1, c3 ;
B b2 = new B() Name = "B2", Cs = new List<C>() c2, c4 ;
B b3 = new B() Name = "B3", Cs = new List<C>() c1, c2, c4 ;
B b4 = new B() Name = "B4", Cs = new List<C>() c1, c2, c3, c4 ;
A a1 = new A() Name = "A1", Bs = new List<B>() b1, b2 ;
A a2 = new A() Name = "A2", Bs = new List<B>() b3, b4 ;
A a3 = new A() Name = "A3", Bs = new List<B>() b1, b2, b3, b4 ;
List<A> listOfAs = new List<A>() a1, a2, a3 ;
return View(listOfAs);
对于最后一块,显示所有这些的视图。简单地以嵌套方式使用 @foreach 就可以满足我们的需求:
@model IEnumerable<HelloMvc.Models.A>
<h2>List of As</h2>
<table>
<tr>
<th></th>
</tr>
@foreach (var a in Model)
<tr>
<td>
@a.Name<br />
@foreach (var b in a.Bs)
@b.Name<br />
foreach (var c in b.Cs)
@c.Name<br />
</td>
</tr>
请注意,“HelloMvc”是我的命名空间。您可能需要将其更改为您自己的命名空间。
所有东西放在一起,这会产生一个包含嵌套 B 和 C 的 A 列表:
A1
B1
C1
C3
B2
C2
C4
A2
B3
C1
C2
C4
B4
C1
C2
C3
C4
A3
B1
C1
C3
B2
C2
C4
B3
C1
C2
C4
B4
C1
C2
C3
C4
(您必须想象一些样式。)希望这个示例对您有所帮助。
(旁注) 有趣的是,第三个 foreach 前面没有“@”。这不是错字或错误,如果我把它放在那里,就会引发异常。我怀疑 Razor 视图引擎中的小错误。
【讨论】:
【参考方案2】:如果你说你有三个模型 A、B 和 C - 你想用从 A、B 和 C 操作的数据显示视图。
您可以这样做,在控制器的 action 方法中进行过滤并将视图作为动态模型(匿名类型)返回。在视图中,您可以阅读此模型并使用所需的 html 构建您的页面。表示使用
您可以选择定义一个新的模型类来表示您需要的结果类型。
【讨论】:
以上是关于在 MVC 3 中渲染复杂视图的主要内容,如果未能解决你的问题,请参考以下文章