Malikdanish Ответов: 1

Как показать одну строку вместо двух строк, имеющих один столбец, отличающийся в MVC


Привет, у меня есть приложение , в котором у меня есть таблицы User, Roles и USer&Roles моя таблица пользователей выглядит так же, как показано ниже

Пользователь (UserId,имя)
Роли(RoleId,RoleName)
Пользователь и роли(tableid,UserId,RoleId)
Хотя у меня есть и другие колонки, но для простоты я беру только необходимые .

У меня есть записи в моей таблице пользователей , таблице ролей и таблице пользователей и ролей, как показано ниже
Таблица пользователей(1,SAN)(2,JAH)(3,HOP)
Таблица ролей(1,администратор)(2,Клиент)(3,Супер-администратор)
Пользователь и его роли(1,1,1)(2,1,2)(3,2,2)(4,2,3)
Как вы можете видеть, мой идентификатор пользователя =1 имеет две роли, а идентификатор пользователя 2 - одну роль


Я хочу показать записи в индексном представлении, например, как user id =1 имеет две роли в таблице базы данных (user&Roles) я хочу показать одну строку, но в столбце role_name я хочу, чтобы запятая разделяла список ролей, назначенных ему, а не показывала все строки с новым role_name и всей другой информацией одинаково .

Что я уже пробовал:

Я показал, но он показывает все строки, как ссылка
<pre>@model IEnumerable<CMS_Monitoring.Models.UserRoles>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout2.cshtml";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.User_Id)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Active)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Role_Id)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Date_Assigned)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Date_Created)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Date_Modified)
        </th>
        <th>Actions</th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Registration.Username)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Active)
        </td>
     
            <td>
                @Html.DisplayFor(modelItem => item.Roles.Role_Name)
            </td>
        

        <td>
            @Html.DisplayFor(modelItem => item.Date_Assigned)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Date_Created)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Date_Modified)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
            @Html.ActionLink("Details", "Details", new { id = item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.Id })
        </td>
    </tr>
}

</table>

1 Ответов

Рейтинг:
2

Richard Deeming

Измените представление таким образом, чтобы оно принимало список пользователей вместо списка ролей пользователей:

@model IEnumerable<CMS_Monitoring.Models.User>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout2.cshtml";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>

<table class="table">
<thead>
    <tr>
        <th scope="col">Name</th>
        <th scope="col">Roles</th>
        <th scope="col">Actions</th>
    </tr>
</thead>
<tbody>
@foreach (var item in Model) 
{
    <tr>
        <th scope="row">
            @Html.DisplayFor(m => m.Username)
        </th>
        <td>
            @string.Join(", ", item.Roles.Select(ur => ur.Role.Name))
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
            @Html.ActionLink("Details", "Details", new { id = item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.Id })
        </td>
    </tr>
}
</tbody>
</table>
Если вы используете Entity Framework, не забудьте сделать это .Include(...) роли при загрузке коллекции пользователей.
var users = Context.Users.AsNoTracking().Include(u => u.Roles.Select(ur => ur.Role)).ToList();
return View(users);


Malikdanish

Моя модель-это таблица UserRoles , а не Users , и в моей таблице User нет никакой связи с таблицей UserRoles, но в таблице UserRoles есть foriegnkey UserId .так какой класс модели мне нужно использовать с моим представлением

Richard Deeming

Если вы хотите отобразить список пользователей в своем представлении, то ваша модель должна быть списком пользователей, а не списком ролей пользователей.

Если вы хотите включить имена ролей, то вам понадобятся подходящие свойства навигации.

Malikdanish

@строка.Join(", ", item.Роли.Выберите(ur => ur.Role.Name)) В этой строке говорится, что роль не содержит определения Select ?