简体   繁体   English

创建管理用户角色页面 - razor 页面

[英]Creating manage user roles page - razor pages

I am following a tutorial on how to create a Manage user roles page for each identity user.我正在学习如何为每个身份用户创建管理用户角色页面的教程。 The only problem I have is that the tutorial is for MVC and I am using razor pages not MVC.我遇到的唯一问题是教程是针对 MVC 的,而我使用的是 razor 页面而不是 MVC。

I am trying to convert the following code so that it works on my razor pages, I've managed to do some but other parts is proving difficult.我正在尝试转换以下代码,以便它可以在我的剃刀页面上运行,我已经设法做到了一些,但事实证明其他部分很困难。

Here is the code that would go in the Controller if i were using MVC:如果我使用 MVC,这里是控制器中的代码:

[HttpGet]
public async Task<IActionResult> ManageUserRoles(string userId)
{
    ViewBag.userId = userId;

    var user = await userManager.FindByIdAsync(userId);

    if (user == null)
    {
        ViewBag.ErrorMessage = $"User with Id = {userId} cannot be found";
        return View("NotFound");
    }

    var model = new List<UserRolesViewModel>();

    foreach (var role in roleManager.Roles)
    {
        var userRolesViewModel = new UserRolesViewModel
        {
            RoleId = role.Id,
            RoleName = role.Name
        };

        if (await userManager.IsInRoleAsync(user, role.Name))
        {
            userRolesViewModel.IsSelected = true;
        }
        else
        {
            userRolesViewModel.IsSelected = false;
        }

        model.Add(userRolesViewModel);
    }

    return View(model);
}

I have convert it to the following and put it in the OnGet section of my page model.我已将其转换为以下内容并将其放入页面模型的 OnGet 部分。

[BindProperty]
public RolesViewModel RolesViewModel { get; set; }
public List<RolesViewModel> model { get; set; }

 public async Task<IActionResult> OnGetAsync(string userId)
        {
            var user = await UserManager.FindByIdAsync(userId);
            if (user == null)
            {
                return NotFound();
            }
            foreach (var role in roleManager.Roles)
            {
                RolesViewModel = new RolesViewModel
                {
                    RoleId = role.Id,
                    RoleName = role.Name
                };

                if (await UserManager.IsInRoleAsync(user, role.Name))
                {
                    RolesViewModel.IsSelected = true;
                }
                else
                {
                    RolesViewModel.IsSelected = false;
                }
                model.Add(RolesViewModel);

            }
            ViewData["model"] = model;
            return Page();
        }

The part thats proving difficult is the html:证明困难的部分是html:

This is their html from the tutorial.这是教程中的 html。

@model List<UserRolesViewModel>

@{
    var userId = ViewBag.userId;
}

<form method="post">
    <div class="card">
        <div class="card-header">
            <h2>Manage User Roles</h2>
        </div>
        <div class="card-body">
            @for (int i = 0; i < Model.Count; i++)
            {
                <div class="form-check m-1">
                    <input type="hidden" asp-for="@Model[i].RoleId" />
                    <input type="hidden" asp-for="@Model[i].RoleName" />
                    <input asp-for="@Model[i].IsSelected" class="form-check-input" />
                    <label class="form-check-label" asp-for="@Model[i].IsSelected">
                        @Model[i].RoleName
                    </label>
                </div>
            }
            <div asp-validation-summary="All" class="text-danger"></div>
        </div>
        <div class="card-footer">
            <input type="submit" value="Update" class="btn btn-primary"
                   style="width:auto" />
            <a asp-action="EditUser" asp-route-id="@userId"
               class="btn btn-primary" style="width:auto">Cancel</a>
        </div>
    </div>
</form>

Could someone let me know what parts o the code I need to change for it to work for me?有人可以让我知道我需要更改代码的哪些部分才能为我工作吗?

Your Page shold be like below:您的页面应该如下所示:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

@{
    var userId = ViewBag.userId;
}

<form method="post">
    <div class="card">
        <div class="card-header">
            <h2>Manage User Roles</h2>
        </div>
        <div class="card-body">
            @for (int i = 0; i < Model.model.Count; i++)
            {
                <div class="form-check m-1">
                    <input type="hidden" asp-for="@Model.model[i].RoleId" />
                    <input type="hidden" asp-for="@Model.model[i].RoleName" />
                    <input asp-for="@Model.model[i].IsSelected" class="form-check-input" />
                    <label class="form-check-label" asp-for="@Model.model[i].IsSelected">
                        @Model.model[i].RoleName
                    </label>
                </div>
            }
            <div asp-validation-summary="All" class="text-danger"></div>
        </div>
        <div class="card-footer">
            <input type="submit" value="Update" class="btn btn-primary"
                   style="width:auto" />
            <a asp-page="EditUser" asp-route-id="@userId"
               class="btn btn-primary" style="width:auto">Cancel</a>
        </div>
    </div>
</form>

Also, you backend code need modify like below:此外,您的后端代码需要修改如下:

[BindProperty]
public RolesViewModel RolesViewModel { get; set; }
public List<RolesViewModel> model { get; set; }

public async Task<IActionResult> OnGetAsync(string userId)
{
    model = new List<RolesViewModel>(); //add this...
    var user = await UserManager.FindByIdAsync(userId);
    if (user == null)
    {
        return NotFound();
    }
    foreach (var role in roleManager.Roles)
    {
        RolesViewModel = new RolesViewModel
        {
            RoleId = role.Id,
            RoleName = role.Name
        };

        if (await UserManager.IsInRoleAsync(user, role.Name))
        {
            RolesViewModel.IsSelected = true;
        }
        else
        {
            RolesViewModel.IsSelected = false;
        }
        model.Add(RolesViewModel);

    }
    ViewData["userId"] = userId;   //change here which matches the frontend `ViewBag.userId`
    return Page();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM