这是我的控制器代码:
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
var user = await UserManager.FindByEmailAsync(model.Email);
if (user != null)
{
if (!await UserManager.IsEmailConfirmedAsync(user.Id))
{
ViewBag.Email = user.Email;
return View("UnconfirmedAccount");
}
}
// Error is showing at this line System.nullReferenceException
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
我用电子邮件和密码登录用户。如果登录id和密码正确,则SignInStatus.成功案例调用成功。但是,如果登录失败,则显示系统。NullRefernceException。
现在,最重要的是,我已经在注册时成功地分离了用户名和电子邮件。现在,在注册时,我将电子邮件和用户名保存在各自的栏中。之前的电子邮件也保存在用户名栏中。但在分离用户名和电子邮件后,我无法登录,所以我不得不将登录操作方法中的这一行更改为:
var result = await SignInManager.PasswordSignInAsync(user.Email, model.Password, model.RememberMe, shouldLockout: false);
到此:
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);
我只想显示无效的登录尝试消息,因为它显示之前,而不是这个黄色屏幕。如何做到这一点。
简单,从UserManager中找到用户后,您正在检查user
是否为空
var user = await UserManager.FindByEmailAsync(model.Email);
if (user != null)
{
....
}
再次,您使用的用户对象在检查之外
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);
所以user
为null,当您尝试访问用户时,它正在抛出null引用异常。用户名。