这是我的注册方法。我将注册方法更改为管理工具。管理工具在没有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);
}
答案 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)
....
你已经在上面这样做了,那么首先进行额外检查有什么意义呢?