Редактирование пользователей в ASP.NET Core Identity

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

список

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

Я обработал удаление так:

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>

И 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. Возможно, у вас есть лучшие решения для этого, но я действительно застрял здесь.


person DVice    schedule 15.05.2018    source источник
comment
И это, конечно, не работает Что это значит? Сообщение об ошибке? Что сказала консоль отладки браузера?   -  person CodeNotFound    schedule 15.05.2018
comment
Не работает, конечно, не очень хорошее описание проблемы. Я не вижу здесь четкого вопроса. В чем проблема с кодом? Чем он отличается от того, что вы ожидаете? Есть сообщения об ошибках? Какие сообщения об ошибках?   -  person Laurenz Albe    schedule 15.05.2018
comment
Извините, реальный вопрос - как заставить его работать ?, потому что я не знаю, как отправить параметр ID из метода Index.cshtml.cs OnPostChange, который должен открывать страницу Edit.cshtml, в Edit.cshtml.cs такие методы, как OnPostEdit   -  person DVice    schedule 15.05.2018
comment
Попробуйте добавить asp-page="Edit" к кнопке редактирования? Подробнее см. Демистификация ядра ASP.NET - Razor Pages.   -  person Mark G    schedule 16.05.2018
comment
Вам нужен маршрут GET для вашей Edit страницы. Вы перенаправляете туда, чтобы браузер отправил туда запрос GET. Там вам нужно отобразить форму, которая затем отправляется через POST, где вы обновляете значения.   -  person poke    schedule 16.05.2018


Ответы (1)


Итак, да, я только что сделал кнопку на своей странице 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>
person DVice    schedule 16.05.2018