Управление пользователями

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 15.12.2019

Для администрирования пользователей продолжим работу с проектом из прошлой темы и добавим в папку Controllers новый контроллер UsersController:

using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Identity;
using CustomIdentityApp.Models;
using CustomIdentityApp.ViewModels;

namespace CustomIdentityApp.Controllers
{
    public class UsersController : Controller
    {
        UserManager<User> _userManager;

        public UsersController(UserManager<User> userManager)
        {
            _userManager = userManager;
        }

        public IActionResult Index() => View(_userManager.Users.ToList());

        public IActionResult Create() => View();

        [HttpPost]
        public async Task<IActionResult> Create(CreateUserViewModel model)
        {
            if (ModelState.IsValid)
            {
                User user = new User { Email = model.Email, UserName = model.Email, Year = model.Year };
                var result = await _userManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    return RedirectToAction("Index");
                }
                else
                {
                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError(string.Empty, error.Description);
                    }
                }
            }
            return View(model);
        }

        public async Task<IActionResult> Edit(string id)
        {
            User user = await _userManager.FindByIdAsync(id);
            if (user == null)
            {
                return NotFound();
            }
            EditUserViewModel model = new EditUserViewModel {Id = user.Id, Email = user.Email, Year = user.Year };
            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> Edit(EditUserViewModel model)
        {
            if (ModelState.IsValid)
            {
                User user = await _userManager.FindByIdAsync(model.Id);
                if(user!=null)
                {
                    user.Email = model.Email;
                    user.UserName = model.Email;
                    user.Year = model.Year;
                    
                    var result = await _userManager.UpdateAsync(user);
                    if (result.Succeeded)
                    {
                        return RedirectToAction("Index");
                    }
                    else
                    {
                        foreach (var error in result.Errors)
                        {
                            ModelState.AddModelError(string.Empty, error.Description);
                        }
                    }
                }
            }
            return View(model);
        }

        [HttpPost]
        public async Task<ActionResult> Delete(string id)
        {
            User user = await _userManager.FindByIdAsync(id);
            if (user != null)
            {
                IdentityResult result = await _userManager.DeleteAsync(user);
            }
            return RedirectToAction("Index");
        }
    }
}

Вся работа с пользователями производится с помощью ранее рассмотренных методов класса UserManager.

Для методов Create и Edit в папке ViewModels создадим дополнительные модели представлений:

public class CreateUserViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
    public int Year { get; set; }
}
public class EditUserViewModel
{
    public string Id { get; set; }
    public string Email { get; set; }
    public int Year { get; set; }
}

А в папку Views добавим подкаталог Users для представлений контроллера. Далее определим в ней представление Index.cshtml для вывода пользователей:

@model IEnumerable<CustomIdentityApp.Models.User>
@{
    ViewBag.Title = "Список пользователей";
}

<a asp-action="Create">Добавить пользователя</a>

<table class="table">
    <tr><th>Email</th><th>Год</th><th></th></tr>
    @foreach (var user in Model)
    {
        <tr>
            <td>@user.Email</td>
            <td>@user.Year</td>
            <td>
                <form asp-action="Delete" asp-route-id="@user.Id" method="post">
                    <a class="btn btn-sm btn-primary" asp-action="Edit" asp-route-id="@user.Id">Изменить</a>
                    <button type="submit" class="btn btn-sm btn-danger">
                        Удалить
                    </button>
                </form>
            </td>
        </tr>
    }
</table>

Также добавим представление Create.cshtml для создания новых пользователей:

@model CustomIdentityApp.ViewModels.CreateUserViewModel
@{
    ViewBag.Title = "Добавление пользователя";
}
<form asp-action="Create" asp-controller="Users">
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="Email" class="control-label">Email</label>
        <input type="text" asp-for="Email" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="Password" class="control-label">Пароль</label>
        <input type="password" asp-for="Password" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="Year" class="control-label">Год рождения</label>
        <input type="number" asp-for="Year" class="form-control" />
    </div>
    <div class="form-group">
        <input type="submit" value="Добавить" class="btn btn-outline-secondary" />
    </div>
</form>

И также добавим представление Edit.cshtml для редактирования пользователей:

@model CustomIdentityApp.ViewModels.EditUserViewModel
@{
    ViewBag.Title = "Редактирование пользователя";
}
<form asp-action="Edit" asp-controller="Users">
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group">
        <input type="hidden" asp-for="Id" />
    </div>
    <div class="form-group">
        <label asp-for="Email" class="control-label">Email</label>
        <input type="text" asp-for="Email" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="Year" class="control-label">Год рождения</label>
        <input type="number" asp-for="Year" class="form-control" />
    </div>
    <div class="form-group">
        <input type="submit" value="Сохранить" class="btn btn-outline-secondary" />
    </div>
</form>

В итоге проект изменится следующим образом:

Администрирование в ASP.NET Core Identity

В теперь при обращении к методу Index контроллера Users мы сможем увидеть список пользователей, отредактировать, удалить или добавить новых пользователей:

Управление пользователями в ASP.NET Core Identity
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850