Редактирование пользователей в ASP.NET Core Identity - PullRequest
0 голосов
/ 15 мая 2018

Я просто пытаюсь создать страницу редактирования для моей базы данных идентичности.Я использую Razor Pages, и я новичок в этом.Я нашел несколько решений для MVC, но они действительно не работают для меня из-за использования Views и других вещей, таких как Controllers.У меня есть главная страница Index.cshtml, где я могу выбрать пользователей из списка, подобного изображению ниже

list

, и удалить их, нажав кнопку отправки.

Я обработал удаление следующим образом:

Файл CSHTML:

<button type="submit" class="btn btn-sm btn-danger" asp-route-id="@user.Id" asp-page-handler="Del">Del</button>
<button type="submit" class="btn btn-sm btn-primary" asp-route-id="@user.Id" asp-page-handler="Change">Change</button>

Файл CSHTML.CS:

   public ApplicationUser ApUser { get; set; }
   public async Task<ActionResult> OnPostDel(string id)
    {
        ApUsers = _userManager.Users.ToList();
        ApUser = await _userManager.FindByIdAsync(id);
        if (ApUser != null)
        {
            IdentityResult result = await _userManager.DeleteAsync(ApUser);
        }
        //return RedirectToAction("UserChange/Index");
        return RedirectToPage("Index");
    }

И он работает прекрасно, но яРедактировать тоже нужно.Поэтому мой метод Edit POST в Index.cshtml.cs выглядит следующим образом:

   public async Task<ActionResult> OnPostChange(string id)
   {
        ApUsers = _userManager.Users.ToList();
        ApUser = await _userManager.FindByIdAsync(id);
        if (ApUser == null)
        {
            return NotFound();
        }
        else return RedirectToPage("Edit");
   }

А мой Edit.cshtml.cs выглядит следующим образом:

<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="Score" class="control-label">Score</label>
    <input type="number" asp-for="Score" class="form-control" />
</div>
...
<div class="form-group">
    <input type="submit" asp-page-handler="Edit" value="Save" class="btn btn-default" />
</div>
</form>

And Edit.cshtml.cs:

public async Task<IActionResult> OnPostEdit(string id)
{
    if (ModelState.IsValid)
    {
        ApUser = await _userManager.FindByIdAsync(id);
        if (ApUser != null)
        {
            ApUser.Email = Email;
            ApUser.UserName = Email;
            ApUser.Score = Score;
            ApUser.Position = Position;
            ApUser.Sequence = Sequence;

            var result = await _userManager.UpdateAsync(ApUser);
            if (result.Succeeded)
            {
                return RedirectToAction("Index");
            }
            else
            {
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }
        }
    }
    return RedirectToAction("Index");
}

И это, конечно, не работает.Я просто пытаюсь переделать пример MVC в Razor Pages.Может быть, у вас есть лучшие решения для этого, но я действительно застрял здесь.

1 Ответ

0 голосов
/ 17 мая 2018

Итак, да, я только что сделал кнопку на своей странице Index.cshtml следующим образом: она предоставляет asp-route-id для страницы редактирования:

<a asp-page="Edit" class="btn btn-sm btn-primary" asp-route-id="@user.Id">Edit</a>

Сделал InputModel для файла Edit.cshtml.cs:

   public InputModel Input { get; set; }
    public class InputModel
    {
        [Required(ErrorMessage ="{0} не может быть пустым")]
        [EmailAddress(ErrorMessage ="Неверный формат {0}")]
        [Display(Name = "Email")]
        public string Email { get; set; }

        [Required(ErrorMessage = "Введите {0}")]
        [StringLength(5, ErrorMessage = "{0} должна быть из {1} символов", MinimumLength = 5)]
        [Display(Name = "Последовательность")]
        public string Sequence { get; set; }
        ...
    }

Просто добавлено в файл Edit.cshtml @page "{id}", чтобы предоставить его через предыдущую страницу Метод OnPost предоставляет пользователю изменения из модели:

public async Task<IActionResult> OnPostAsync(string id)
{
    ApUser = await _userManager.FindByIdAsync(id);
    if (!ModelState.IsValid)
    {
        return Page();
    }
    ApUser.Email = Input.Email;
    ApUser.Score = Input.Score;
    ApUser.Sequence = Input.Sequence;
    ApUser.Position = 0;
    await _userManager.UpdateAsync(ApUser);
    Message = ApUser.Email;
    return RedirectToPage("Index");
}

А я просто использую модель в Edit.cshtml

<form method="post" asp-route-id="@Model.ApUser.Id">
<div class="form-group">
<label asp-for="Input.Email"></label>
<input asp-for="Input.Email" class="form-control" value="@Model.ApUser.Email.ToString()" />
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
...
<button type="submit" class="btn btn-default">Save</button>
</form>
...