在MVC 3中渲染复杂视图

时间:2011-10-28 14:42:04

标签: asp.net-mvc asp.net-mvc-3 view

我有一个包含三个表的数据库:A,B和C.

我希望视图以特定方式呈现数据。循环通过A,然后在A下面列出B的行,其中B.aID = A.ID,列出B的每一行下的每一行C,其中C.bId = B.ID。

我是ASP.NET MVC3的新手,我不知道如何实现这一目标。我见过的所有例子都是直截了当的。

2 个答案:

答案 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类,它将表示您需要的结果类型。