我有一个包含三个表的数据库:A,B和C.
我希望视图以特定方式呈现数据。循环通过A,然后在A下面列出B的行,其中B.aID = A.ID,列出B的每一行下的每一行C,其中C.bId = B.ID。
我是ASP.NET MVC3的新手,我不知道如何实现这一目标。我见过的所有例子都是直截了当的。
答案 0 :(得分:2)
我首先添加三个模型: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视图引擎中的小错误。
答案 1 :(得分:1)
如果你说你有三个模型A,B和C - 并且你想用A,B和C操纵数据来显示视图。
您可以执行此操作,在控制器的操作方法中执行过滤并将视图作为动态模型返回(匿名类型)。在视图中,您可以阅读此模型并使用所需的html构建页面。意味着使用
或者,您可以定义一个新的Model类,它将表示您需要的结果类型。