Отображение данных с помощью Partial View

177
26 марта 2018, 22:09

Есть 2 модели, пользователи и программы (в этом вопросе есть описание моделей). Я хочу отобразить в таблицах все программы из бд, и следом всех пользователей.

Сделал 1 контроллер с 2 экшанами и 2 view.

Context db = new Context();
        public ActionResult Progs()
        {
            IEnumerable<Prog> progs = db.Progs;
            ViewBag.Progs = progs;
            return View();
        }
        public ActionResult Users()
        {
            IEnumerable<User> users = db.Users.Include(u => u.Prog);
            return View(users);
        }
<table class="table table-bordered">
    <thead>
        <tr>
            <th>Номер строки</th>
            <th>Название программы</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in ViewBag.Progs)
        {
            <tr>
                <th scope="row">@item.Id</th>
                <td>@item.Name</td>
            </tr>
        }
    </tbody>
</table>
@Html.Partial("Users");
@model IEnumerable<WebApplication3.Models.User>
<table class="table table-bordered">
    <thead>
        <tr>
            <th>Номер строки</th>
            <th>Название программы</th>
            <th>Фамилия пользователя</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <th scope="row">@item.Id</th>
                <td>@item.Surname</td>
                <td>@item.Age</td>
                <td>@item.Prog.Name</td>
            </tr>
        }
    </tbody>
</table>

View User идёт как partial. И когда вызывается экшен контроллера для программ, отрисоваться должны и юзеры, но так как для юзеров данных нет, то и рисовать не из чего, ведь контроллер юзеров не трогается, как в таких случаях поступают? Пробова из экшена программ через ViewBag передавать ещё и юзеров для отрисовки, но не получилось. МОжет как то можно задействовать экшен юзеров в таком случае? Или это нужно сделать как то подругому? Подскажите пожалуйста, только начинаю изучать mvc.

Answer 1

У @Html.Partial() есть перегрузка, в которой можно указать данные, а не только имя представления.

Если вы хотите вывести все программы и для каждой указать всех пользователей этих программ, то вам нужно что-то в духе:

public ActionResult ProgsWithUsers()
{
    IEnumerable<Prog> progs = db.Progs.Include(x => x.Users).ToArray();
    return View(progs);
}

Во вью:

@model IEnumerable<WebApplication3.Models.Prog>
<table class="table table-bordered">
    <thead>
        <tr>
            <th>Номер строки</th>
            <th>Название программы</th>
            <th>Пользователи</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var program in Model)
        {
            <tr>
                <th scope="row">@program.Id</th>
                <td>@program.Name</td>
            </tr>
            @if(program.Users.Count() > 0)
            {
                <td>@Html.Partial("Users", program.Users)</td>
            }
            else
            {
                <td>–</td>
            }
        }
    </tbody>
</table>

Ну и в partial view:

@model IEnumerable<WebApplication3.Models.User>
@foreach (var user in Model)
{
    <div>@user.Surname</div>
}
READ ALSO
Поиск по году в БД

Поиск по году в БД

Есть таблица со столбцом "Дата" формата 2018-03 в sql serverВвел в textBox год 2018 Как вывести в DataGridView все записи c таким годом?

187
Крутящееся колесо SVG

Крутящееся колесо SVG

Необходимо сделать крутящийся круг из секторов

240
Проблема с дополенеием Cannot set property &#39;onclick&#39; of null

Проблема с дополенеием Cannot set property 'onclick' of null

Разрабатываю расширения для Chrome (Opera and Yandex)Появилась ошибка в консоли "popup

214
Как перенести проект с create-react-app в gatsby.js

Как перенести проект с create-react-app в gatsby.js

Привет!Нужно перенести проект созданный на react-create-app в Gatsbyjs но там разная структура файлов и нету файла сss

219