Identity 3.0当id为"int"时通过id获取用户

si2*_*030 4 asp.net-core-mvc asp.net-identity-3

我已经浏览了Identity 3.0的答案,并且发现很少有关于获得具有int id的单个用户.

我有一个asp.net-core mvc6项目,我在其中使用字符串id转换所有用户和角色以获得整数id.

精细.这样可行.我有一个UserAdminController,其中包括更新或编辑动作,它传递"int?" 为id.

public async Task<IActionResult> Edit(int? id)
Run Code Online (Sandbox Code Playgroud)

在我的服务中,我想让用户与整数id ..."1"相关联.

我想使用UserManger.FindByIdAsync(id)来获取具有该id的用户.

问题是,这需要一个"字符串"id而不是"int"id.

使用UserManger(如果可以的话)如何返回一个整数而不是字符串id的用户?必须有一种优雅的方式来返回用户?

Kév*_*let 9

只需将您的用户标识符作为字符串流动...

var user = _userManager.FindByIdAsync("1");
Run Code Online (Sandbox Code Playgroud)

...并且Identity会在内部将其转换回您在ConfigureServices使用时注册时配置的密钥类型TypeConverter:

public virtual Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
    cancellationToken.ThrowIfCancellationRequested();
    ThrowIfDisposed();
    var id = ConvertIdFromString(userId);
    return Users.FirstOrDefaultAsync(u => u.Id.Equals(id), cancellationToken);
}


public virtual TKey ConvertIdFromString(string id)
{
    if (id == null)
    {
        return default(TKey);
    }
    return (TKey)TypeDescriptor.GetConverter(typeof(TKey)).ConvertFromInvariantString(id);
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,太可怕了.在.net核心中,这似乎是唯一的答案. (3认同)

si2*_*030 5

Aliz 走在正确的轨道上,但是他建议的方法在 Identity 3.0 中并不存在。

然而,这确实使用作为基础的 Aliz 选项编号 1..

var user = await _userManager.Users.FirstOrDefaultAsync(u => u.Id == id);
Run Code Online (Sandbox Code Playgroud)