Возврат пользовательских ролей для просмотра после успешного добавления ролей - PullRequest
0 голосов
/ 08 июля 2019

Я успешно реализовал ApplicationUser и роли в моем приложении MVC .NET Core.Однако, когда я возвращаю это к представлению, это не заполняет, что пользователь был добавлен к роли.

Вот часть, связанная с контроллерами:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit (string id, ApplicationUser applicationUser)
{
    if (id != applicationUser.Id)
    {
        return NotFound();
    }
    if (ModelState.IsValid)
    {
        ApplicationUser userFromDb = _db.ApplicationUsers.Where(u => u.Id == id).FirstOrDefault();

        userFromDb.FirstName = applicationUser.FirstName;
        userFromDb.LastName = applicationUser.LastName;

        if (applicationUser.IsModerator)
        {
            await _userManager.AddToRoleAsync(userFromDb, SD.ModeratorEndUser);
        }
        if (!applicationUser.IsModerator)
        {
            await _userManager.RemoveFromRoleAsync(userFromDb, SD.ModeratorEndUser);
        }

        if (applicationUser.IsOwner)
        {
            await _userManager.AddToRoleAsync(userFromDb, SD.OwnerEndUser);
        }
        if (!applicationUser.IsOwner)
        {
            await _userManager.RemoveFromRoleAsync(userFromDb, SD.OwnerEndUser);
        }

        _db.SaveChanges();
        return RedirectToAction(nameof(Index));
    }

Этот контроллеруспешно добавив или удалив роль, переданную ему из представления, которое я покажу ниже: (Когда я проверяю таблицу SQL - она ​​успешно добавлена ​​или удалена в таблицу AspNetUserRoles, так что функциональность работает - я просто не могузаставить его отображаться соответствующим образом после этого.)

@model Sentimented.Models.ApplicationUser

@{
    ViewData["Title"] = "Edit";
}
<br />
<h2 class="text-info">Edit User Roles</h2>

<form method="post" asp-action="Edit">
    <div class="p-4 border rounded">
        <input type="hidden" asp-for="Id" />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group row">
            <div class="col-2">
                <label asp-for="FirstName"></label>
            </div>
            <div class="col-5">
                <input asp-for="FirstName" class="form-control" />
            </div>
            <span asp-validation-for="FirstName" class="text-danger"></span>
        </div>
        <div class="form-group row">
            <div class="col-2">
                <label asp-for="LastName"></label>
            </div>
            <div class="col-5">
                <input asp-for="LastName" class="form-control" />
            </div>
            <span asp-validation-for="LastName" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="IsModerator"></label>
            <input asp-for="IsModerator" type="checkbox" class="form-control" />
        </div>
        <div class="form-group">
            <label asp-for="IsOwner"></label>
            <input asp-for="IsOwner" type="checkbox" class="form-control" />
        </div>
        <br />
        <div class="form-group">
            <input type="submit" class="btn btn-primary" asp-route-id="@Model.Id " value="Update" />
            <a asp-action="Index" class="btn btn-success">Back to List</a>
        </div>
    </div>
</form>

@section Scripts{
    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

А здесь представление индекса, которое неправильно отображает роли как ложные.

      @model IEnumerable<Sentimented.Models.ApplicationUser>

@{
    ViewData["Title"] = "Index";
}
<br />

<div class="row">
    <div class="col-6">
        <h2 class="text-info">User List</h2>
    </div>

    <div class="col-6 text-right">
        <a asp-action="New" class="btn btn-info"><i class="fas fa-plus"></i>&nbsp; New Text</a>
    </div>
</div>

<br />

<div>
    <table class="table table-striped border">
        <tr class="table-info">
            <th>
                @Html.DisplayNameFor(m => m.FirstName)
            </th>
            <th>
                @Html.DisplayNameFor(m => m.LastName)
            </th>
            <th>
                @Html.DisplayNameFor(m => m.Email)
            </th>
            <th>
                @Html.DisplayNameFor(m => m.IsOwner)
            </th>
            <th>
                @Html.DisplayNameFor(m => m.IsModerator)
            </th>
            <th>
                Edit
            </th>
            <th>
                Details
            </th>
        </tr>

        @foreach (var item in Model)
        {
    <tr>
        <td>@Html.DisplayFor(m => item.FirstName)</td>
        <td>@Html.DisplayFor(m => item.LastName)</td>
        <td>@Html.DisplayFor(m => item.Email)</td>
        <td>@Html.DisplayFor(m => item.IsModerator)</td>
        <td>@Html.DisplayFor(m => item.IsOwner)</td>

        <td>
            <a type="button" class="btn btn-primary" href="@Url.Action("Edit/" + item.Id)">
                <i class="fas fa-edit"></i>
            </a>
        </td>
        <td>
            <a type="button" class="btn btn-primary" href="@Url.Action("Details/" + item.Id)">
                <i class="fas fa-edit"></i>
            </a>
        </td>
    </tr>
        }
    </table>
</div>

Извинения, если я включил слишком много кода- но как мне получить приведенное выше представление для возврата item.IsModerator и item.IsOwner как true и не false?

Спасибо!

Редактировать:

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

Индекс страницы пользователя

А вот соответствующий контроллер индекса:

public IActionResult Index()
{
    var users = _db.ApplicationUsers.ToList();

    return View(users);
}

1 Ответ

0 голосов
/ 08 июля 2019

Поскольку пользователь уже вошел в систему, эта строка кода, ожидающая _userManager.AddToRoleAsync(userFromDb, SD.OwnerEndUser);, обновит БД, но не куки. Вы должны переиздать cookie:

Таким образом, после _db.SaveChanges(); вы можете использовать _signInManager.RefreshSignInAsync(userFromDb).

Вам нужно ввести SignInManager как:

private readonly SignInManager<ApplicationUser> _signInManager;
public HomeController(SignInManager<ApplicationUser> signInManager)
{
    _signInManager = signInManager;
}

И обновите куки пользователя:

await _signInManager.RefreshSignInAsync(userFromDb);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...