戳戳猫的小窝
更新日志
关于
登录也需要视图模型 # 创建LoginViewModel LoginViewModel中有Username和Password2个属性,代码如下: ``` public class LoginViewModel { [Display(Name = "用户名")] [Required(ErrorMessage = "用户名不能为空")] public string Username { get; set; } = string.Empty; [Display(Name = "密码")] [Required(ErrorMessage = "密码不能为空")] [DataType(DataType.Password)] public string Password { get; set; } = string.Empty; } ``` 其中`[DataType(DataType.Password)]`会将input设置为`type="password"`。 # 创建AccountController 创建AccountController,并注入SignInManager实例,代码如下: ``` public class AccountController(SignInManager<IdentityUser> signInManager) : Controller { } ``` # 添加Login动作 将默认的Index动作修改为Login。 ``` public IActionResult Login() { return View(); } ``` # 创建Login视图 在Views下的Account文件夹下创建Login.cshtml视图文件,代码如下: ``` @{ ViewBag.Title = "登录"; } @model LoginViewModel <form method="post" style="width:480px;" class="box mx-auto my-6"> <div asp-validation-summary="All" class="has-text-danger mb-4"></div> <div class="field"> <label asp-for=Username class="label"></label> <div class="control"> <input asp-for=Username class="input" /> </div> </div> <div class="field"> <label asp-for="Password" class="label"></label> <div class="control"> <input asp-for="Password" class="input" /> </div> </div> <button class="button is-primary">登录</button> </form> ``` # 创建post请求的Login动作 通过**SignInManager**的**PasswordSignInAsync**可以实现登录功能,代码如下: ``` [HttpPost] public async Task<IActionResult> Login(LoginViewModel model, string? returnUrl = null) { if (ModelState.IsValid) { var result = await signInManager.PasswordSignInAsync(model.Username, model.Password, true, false); if (result.Succeeded) { if (!string.IsNullOrEmpty(returnUrl)) { return Redirect(returnUrl); } return RedirectToAction("Index", "Home"); } } ModelState.AddModelError(string.Empty, "密码或用户名不正确"); return View(model); } ``` 其中第一个参数是用户名,第二个参数是密码,第三个参数表示是否记住登录,第四个参数表示如果用户名或密码输入错误是否锁定用户。 PasswordSignInAsync返回一个结果。 如果登录成功,且没有returnUrl,则重定向到主页,否则返回到returnUrl所指的地址。
登录