You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 5 Blazor WASM中将Identity User分配给Box并支持用户名传参

方案实现

你的现有模型结构不需要修改,只需要加一层用户名和用户ID的映射逻辑即可,实现分后端API准备和Blazor前端实现两部分:

1. 后端API准备

首先在你的控制器中注入UserManager<ApplicationUser>,提供两个必要的接口:

  • 拉取所有用户的精简信息(用于下拉选择场景)
[HttpGet("users")]
public async Task<IActionResult> GetAllUsers()
{
    // 仅返回必要的ID和用户名,避免泄露敏感信息
    var userList = await _userManager.Users
        .Select(u => new { u.Id, u.UserName })
        .ToListAsync();
    return Ok(userList);
}
  • 根据用户名查询用户ID(用于手动输入用户名场景)
[HttpGet("user-by-name/{userName}")]
public async Task<IActionResult> GetUserByName(string userName)
{
    var user = await _userManager.FindByNameAsync(userName);
    if (user == null) return NotFound("用户不存在");
    return Ok(new { user.Id, user.UserName });
}

2. Blazor前端实现

推荐优先用下拉选择的方式,避免手动输入用户名出错,实现逻辑如下:

页面逻辑定义

在Box新增/编辑页的@code块中定义变量和初始化逻辑:

// 存储所有可选用户列表
private List<(string Id, string UserName)> UserList { get; set; } = new();
// 存储当前编辑的Box实例
private Box CurrentBox { get; set; } = new();

protected override async Task OnInitializedAsync()
{
    // 页面初始化时拉取用户列表
    UserList = await _httpClient.GetFromJsonAsync<List<(string Id, string UserName)>>("api/你的控制器名称/users");
}

UI绑定

用InputSelect组件做选择器,展示用户名,实际绑定用户ID到Box的UserId字段:

<EditForm Model="CurrentBox" OnValidSubmit="SaveBox">
    <!-- 其他Box字段的输入框省略 -->
    <div class="form-group">
        <label>分配用户</label>
        <InputSelect @bind-Value="CurrentBox.UserId" class="form-control">
            <option value="">请选择用户</option>
            @foreach (var user in UserList)
            {
                <option value="@user.Id">@user.UserName</option>
            }
        </InputSelect>
    </div>
    <button type="submit" class="btn btn-primary">保存</button>
</EditForm>

手动输入用户名的补充实现

如果你确实需要支持直接输入用户名赋值,增加以下逻辑即可:

<!-- 增加用户名输入框 -->
<input type="text" @bind-Value="InputUserName" @bind:after="MatchUser" placeholder="输入用户名" class="form-control" />

@code {
    private string InputUserName { get; set; }
    private async Task MatchUser()
    {
        if (string.IsNullOrWhiteSpace(InputUserName))
        {
            CurrentBox.UserId = null;
            return;
        }
        try
        {
            var user = await _httpClient.GetFromJsonAsync<(string Id, string UserName)>($"api/你的控制器名称/user-by-name/{InputUserName}");
            CurrentBox.UserId = user.Id;
        }
        catch (HttpRequestException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
        {
            CurrentBox.UserId = null;
            // 这里可自行增加用户不存在的提示逻辑
        }
    }
}

注意事项

保存Box到数据库时,仅需要保证UserId字段赋值正确即可,EF Core会自动处理外键关系,不需要手动查询完整的ApplicationUser对象赋值给导航属性。

内容的提问来源于stack exchange,提问作者Nate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:15:07