如何检查控制器中是否已存在用户?

时间:2016-06-30 19:09:41

标签: asp.net-mvc asp.net-identity

这是我的注册方法。我将注册方法更改为管理工具。管理工具在没有if语句的情况下正常工作。但是,它不喜欢我寻找现有用户的方式。

    // POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{    
    if (ModelState.IsValid)
    {
        if(_context.Users.Contains(model.UserName))//Errors out here
        {
            var user = new ApplicationUser { UserName = model.UserName};
            user.UserName = model.UserName;
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await this.UserManager.AddToRoleAsync(user.Id, model.Name);
                return RedirectToAction("Index","User");
            }
        AddErrors(result);
        }
    }
    return View(model);
}

1 个答案:

答案 0 :(得分:5)

尝试改为:

if(!_context.Users.Any(x => x.UserName == model.UserName))

假设Users中的用户名称为UserName ..如果条件存在,Any返回true或false。

无论如何,我认为你的逻辑是倒退的。我想如果用户不存在就想创建一个用户,这就是我上面做的。

然而,使用UserManager可能更好。

var user = await UserManager.FindByNameAsync(model.UserName);
if (user != null)
    ...

最好将UserManager用于所有内容的原因是因为您没有创建多个冲突的DbContexts(UserManager有一个,您创建一个单独的)。这可能会导致您使用一个上下文创建对象的问题,并尝试在另一个上下文中使用,这会导致各种令人头疼的问题。

然而,最有效的方法是简单地尝试创建用户,并检查结果是否成功。

var result = await UserManager.CreateAsync(...)
if (result.Succeeded)
    ....

你已经在上面这样做了,那么首先进行额外检查有什么意义呢?