@using System.Security.Claims @* extra using directives can be added in the views, here it is added for using the ClaimTypes class below *@
@model IEnumerable<UserModel>
@* Generated from Custom Template. *@
@* Model namespace using directive should be added to _ViewImports.cshtml. *@
@{
var containerDivClass = "container";
}
@{
ViewData["Title"] = "User List";
}
<div class="@containerDivClass">
<h3>@ViewData["Title"]</h3>
<hr />
</div>
@if (Model is not null)
{
<form asp-action="Index" autocomplete="off">
<div class="@containerDivClass">
<div class="row">
<div class="col-12 text-danger">
@TempData["Message"]
</div>
</div>
<div class="row mb-3">
<div class="col-10 text-success">
@Model.Count() record(s) found.
</div>
<div class="col-2 text-end">
@if (User.IsInRole("Admin")) // show Create link for the Admin role
{
<a asp-action="Create">Create</a>
}
</div>
</div>
<table class="table table-striped table-hover">
<thead class="table-secondary">
<tr>
<th>
@Html.DisplayNameFor(model => model.UserName)
</th>
@* we don't want to show the password in user list, this part can be deleted *@
@* <th>
@Html.DisplayNameFor(model => model.Password)
</th> *@
<th>
@Html.DisplayNameFor(model => model.IsActive)
</th>
<th>
@Html.DisplayNameFor(model => model.Status)
</th>
<th>
@Html.DisplayNameFor(model => model.Role) @* property for formatted or relational data in the model *@
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
@* we don't want to show the password in user list, this part can be deleted *@
@* <td>
@Html.DisplayFor(modelItem => item.Password)
</td> *@
<td>
@Html.DisplayFor(modelItem => item.IsActive)
</td>
<td>
@Html.DisplayFor(modelItem => item.Status)
</td>
<td>
@Html.DisplayFor(modelItem => item.Role) @* property for formatted or relational data in the model *@
</td>
<td class="text-end w-25">
@if (User.IsInRole("Admin")) // show Details, Edit and Delete links for the Admin role
{
<a asp-action="Details" asp-route-id="@item.Record.Id">Details</a>@: |
<a asp-action="Edit" asp-route-id="@item.Record.Id">Edit</a>@: |
<a asp-action="Delete" asp-route-id="@item.Record.Id">Delete</a>
}
else // for User role
{
// retrieving the user Id from user claims for type Id and converting its string value to integer, then assigning its value to the userId variable
var userId = Convert.ToInt32(User.Claims.SingleOrDefault(c => c.Type == "Id").Value);
if (userId == item.Record.Id) // show Delete link if the item id value equals to the application user's Id value
// for allowing the application users delete their own user data
{
<a asp-action="Delete" asp-route-id="@item.Record.Id">Delete</a>
}
}
</td>
</tr>
}
</tbody>
</table>
</div>
</form>
}