简体   繁体   English

在 C# 中更新用户后立即分配 IdentityRole (Blazor WebAssembly)

[英]Assigning IdentityRole just after updating the user in C# (Blazor WebAssembly)

Problem问题

I have a Blazor WebAssembly project with Identity.我有一个带有身份的 Blazor WebAssembly 项目。 I extended IdentityUser table and added a Group column.我扩展了 IdentityUser 表并添加了一个Group列。 I have a waiting list page where I list all the users without any group.我有一个等待列表页面,我在其中列出了没有任何组的所有用户。 When assigning a new group to user, I then call RolesController to add role to user with a same name as their group.当为用户分配一个新组时,我然后调用RolesController向与他们的组同名的用户添加角色。 Problem is when RolesController called, passed object of user has still no group.问题是当 RolesController 调用时,用户传递的对象仍然没有组。

Code代码

WaitingList.razor: WaitingList.razor:

@if (waitingUsers == null)
{
    <p> Loading </p>
}
else
{
    foreach (AspNetUsers user in waitingUsers)
    {
        <div class="container">
            <div class="row justify-content-start">
                <p> isim: @user.FirstName @user.SurName</p>

                <select class="form-control"
                        @bind="user.Group">

                    <option value="0">---Please select a group---</option>

                    @foreach (var group in groups)
                    {
                        @if (group.Id == groupId)
                        {
                            <option selected value="@group.Id"> @group.GroupName </option>
                        }
                        else
                        {
                            <option value="@group.Id"> @group.GroupName </option>
                        }

                    }
                </select>
            </div>
        </div>
    }
    @if (waitingUsers.Length > 0)
    {
        <button onclick="@Update(waitingUsers)"> Update </button>
    }
}

@code {
    AspNetUsers[] waitingUsers;
    public int groupId = 0;
    private List<Groups> groups = new List<Groups>();

    protected override async Task OnInitializedAsync()
    {
        waitingUsers = await http.GetFromJsonAsync<AspNetUsers[]>("api/AspNetUsers/noGroup");
        groups = await http.GetFromJsonAsync<List<Groups>>("api/groups");
    }

    async Task Update(AspNetUsers[] users)
    {
        foreach (AspNetUsers user in users)
        {
            /* 
            at first version Put method was like this:
            await http.PutAsJsonAsync($"api/AspNetUsers/newGroup/{user.Id}", user);
            */
            http.PutAsJsonAsync($"api/AspNetUsers/newGroup/{user.Id}", user).Wait();
           

            // route to RolesController
            await http.PostAsJsonAsync<AspNetUsers>("AddNewRole", user);
           
            await js.InvokeVoidAsync("alert", $"Updated Successfully!");
        }
    }

How can I make sure users' groups assigned first?如何确保首先分配用户组? Wait method didn't worked out.等待方法没有奏效。

The main bug is with主要错误是

onclick="@Update(waitingUsers)"

should be @onclick="@(e => Update(waitingUsers)"应该是@onclick="@(e => Update(waitingUsers)"

Here you have a working example:这里有一个工作示例:

@page "/"

@foreach (AspNetUsers user in waitingUsers)
{
    <div class="container">
        <div class="row justify-content-start">
            <p> isim: @user.FirstName @user.SurName</p>

            <select class="form-control"
                    @bind="user.Group">

                <option value="0">---Please select a group---</option>

                @foreach (var group in groups)
                {
                    @if (group.Id == groupId)
                    {
                        <option selected value="@group.Id.ToString()"> @group.GroupName </option>
                    }
                    else
                    {
                        <option value="@group.Id.ToString()"> @group.GroupName </option>
                    }

                }
            </select>
        </div>
    </div>
}

@if (waitingUsers.Count > 0)
{
    <button @onclick="Update"> Update </button>
}

<br />

<ul class="list-group">
    @foreach (var item in waitingUsers)
    {
        <li class="list-group-item">@item.FirstName Group: @item.Group</li>
    }
</ul>

@code {
    class AspNetUsers
    {
        public string FirstName { get; set; }
        public string SurName { get; set; }

        public string Group { get; set; }
    }

    class Groups
    {
        public int Id { get; set; }
        public string GroupName { get; set; }
    }

    List<AspNetUsers> waitingUsers = new List<AspNetUsers>();

    public int groupId = 0;
    private List<Groups> groups = new List<Groups>();

    protected override async Task OnInitializedAsync()
    {
        waitingUsers = new List<AspNetUsers>();
        waitingUsers.Add(new AspNetUsers { FirstName = "John Doe" });
        waitingUsers.Add(new AspNetUsers { FirstName = "Test Test" });
        waitingUsers.Add(new AspNetUsers { FirstName = "Mark Jack" });
        groups = new List<Groups>();
        groups.Add(new Groups { Id = 1, GroupName = "Group 1" });
        groups.Add(new Groups { Id = 2, GroupName = "Group 2" });
        groups.Add(new Groups { Id = 3, GroupName = "Group 3" });
    }

    async void Update(MouseEventArgs e)
    {
        foreach (AspNetUsers user in waitingUsers)
        {

        }
    }
}

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

相关问题 如何在Blazor WebAssembly项目中使用C# 9? - How to use C# 9 in Blazor WebAssembly project? 如何在 C# Blazor WebAssembly 中使用引导图标? - How do I use Bootstrap Icons in C# Blazor WebAssembly? 如何从 C# Blazor WebAssembly 的 HttpClient 检索 cookies - How to retrieve cookies from an HttpClient from C# Blazor WebAssembly C# Blazor WebAssembly:参数 2:无法从“void”转换为“Microsoft.AspNetCore.Components.EventCallback” - C# Blazor WebAssembly: Argument 2: cannot convert from 'void' to 'Microsoft.AspNetCore.Components.EventCallback' C# .NET 核心托管 Blazor WebAssembly - 将其他客户端添加到.Server 项目 ZDB974238714CA38DE634A7CE1D0 - C# .NET Core Hosted Blazor WebAssembly - Add additional clients to .Server project API c#使用循环将用户输入分配给数组 - c# assigning user inputs to arrays with loops C#-将用户输入分配到for循环的列表中 - C# - Assigning user input into a list in a for loop 分配数据源c#后没有列表框项目 - no listbox items after assigning datasource c# 将 UserStore(Of ApplicationUser, IdentityRole) vb 代码翻译成 C# - Tranlating UserStore(Of ApplicationUser, IdentityRole) vb code to C# 使用 C# 创建 WebAssembly - Create WebAssembly using c#
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM