Рендеринг сложного представления в MVC 3

#asp.net-mvc #asp.net-mvc-3 #view

#asp.net-mvc #asp.net-mvc-3 #Вид

Вопрос:

У меня есть база данных, в которой есть три таблицы: A, B и C.

Я хочу, чтобы представление отображало данные определенным образом. Перебираем A, затем перечисляем строки B под A, где B.Помощь = A.ID , перечисляя каждую строку C под каждой строкой B, где C.Ставка = 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; }
}
  

В моем контроллере я бы добавил метод action, который заполняет эти модели данными. В целях тестирования я использую фиктивные данные.

 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» — это мое пространство имен. Вероятно, вам нужно изменить это на свое собственное пространство имен.

Все вместе взятое приводит к списку элементов A с вложенными B и C.:

 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.

Вы можете сделать это, в методе действия вашего контроллера выполните фильтрацию и верните представление в виде динамической модели (анонимный тип). В представлении вы можете прочитать эту модель и структурировать свою страницу, используя требуемый html. Означает использовать

При желании вы можете определить новый класс модели, который будет представлять требуемый вам результирующий тип.