ASP.NET Core 用户注册

在本章中,我们将讨论用户注册。我们现在有了一个数据库,是时候开始向应用程序添加一些功能了。我们还配置了我们的应用程序,我们有一个工作的数据库模式。现在让我们进入应用程序主页。

我们把之前做的页面搬过来后如下:

这时,我们可以按下 F12,打开控制台,观察网络(Network),然后点击 Edit

  • 您将看到浏览器请求编辑页面,MVC 框架决定用户无权查看此资源。
  • 现在,身份中间件已经就位。Identity 中间件查看将发送给用户的 302 状态代码,这是一个重定向状态代码。
  • Identity 框架知道用户必须尝试登录才能访问此资源。
  • Identity 框架将我们引向这个 URL,我们可以在地址栏- /Account/Login 中看到。
  • 当您注册这些服务和中间件时,这是一个带有 Identity 框架的可配置端点,位于 Startup 内部。您可以设置不同的选项,其中一个选项是更改登录 URL
  • 默认情况下,URL 将为 /Account/Login。目前,我们没有帐户控制器,所以最终我们要做的是创建帐户控制器并允许用户登录。
  • 但在用户登录之前,他们需要在网站上注册并保存用户名和密码。
  • 登录和注册功能都可以是帐户控制器的一部分。

现在让我们继续,在 Controllers 文件夹中添加一个新类,并将其称为 AccountController。我们将从 MVC 框架的基础 Controller 类中派生出这一点。

  1. using Microsoft.AspNetCore.Mvc;
  2. using System.ComponentModel.DataAnnotations;
  3. namespace MyCoreWeb.Controllers
  4. {
  5. public class AccountController : Controller
  6. {
  7. public IActionResult Index()
  8. {
  9. return View();
  10. }
  11. }
  12. }
  • 我们现在必须设置一个注册功能,让用户可以注册该网站。
  • 就像一个编辑表单。
  • 当用户想要注册时,我们将首先显示一个表单,允许他们填写所需信息。然后,他们可以将此表单上传到网站。
  • 然后将此信息保存在数据库中。

因此将上述代码修改为:

  1. using Microsoft.AspNetCore.Mvc;
  2. using System.ComponentModel.DataAnnotations;
  3. namespace MyCoreWeb.Controllers
  4. {
  5. public class AccountController : Controller
  6. {
  7. [HttpGet]
  8. public ViewResult Register()
  9. {
  10. return View();
  11. }
  12. }
  13. }

我们不需要查找任何信息,用户将提供我们需要的所有信息。在为该视图构建 ViewModel 之前,我们需要决定视图将显示的信息。我们还需要决定需要从用户那里接收哪些信息?

让我们通过在 AccountController.cs 文件中添加一个新类来创建此场景的视图模型,并将其称为 RegisterViewModel

让我们创建一些属性来保存用户名、密码和用户确认密码,方法是输入两次并确保两个密码匹配,如下所示。

  1. public class RegisterViewModel
  2. {
  3. [Required, MaxLength(256)]
  4. public string Username { get; set; }
  5. [Required, DataType(DataType.Password)]
  6. public string Password { get; set; }
  7. [DataType(DataType.Password), Compare(nameof(Password))]
  8. public string ConfirmPassword { get; set; }
  9. }

在上面的代码中,您可以看到一些注释,这些注释可以帮助我们验证这个模型。这里需要用户名,如果查看数据库,则保存用户名的列长度为 256 个字符。

  • 我们还将在这里应用 MaxLength 属性。
  • 将需要密码,当我们为该密码呈现输入时,我们希望输入类型为 DataType.Password,以便字符不会显示在屏幕上。
  • 确认密码也将是 DataType.Password,然后还有一个额外的 Compare 属性。我们将把 ConfirmPassword 字段与我们可以指定的另一个属性(即 Password 字段)进行比较。

现在让我们创建所需的视图。我们需要向视图中添加一个新文件夹,并将其称为 Account,因此与 AccountController 相关的所有视图都将添加到此文件夹中。

现在右击 Account 文件夹,添加一个新视图,命名为 Register

Register 的代码如下:

  1. @model RegisterViewModel
  2. @{
  3. ViewBag.Title = "注册";
  4. }
  5. <h1>Register</h1>
  6. <form method="post" asp-controller="Account" asp-action="Register">
  7. <div asp-validation-summary="ModelOnly"></div>
  8. <div>
  9. <label>用户名</label>
  10. <input asp-for="Username" />
  11. <span asp-validation-for="Username"></span>
  12. </div>
  13. <div>
  14. <label>密码</label>
  15. <input asp-for="Password" />
  16. <span asp-validation-for="Password"></span>
  17. </div>
  18. <div>
  19. <label>确认密码</label>
  20. <input asp-for="ConfirmPassword" />
  21. <span asp-validation-for="ConfirmPassword"></span>
  22. </div>
  23. <div>
  24. <input type="submit" value="注册" />
  25. </div>
  26. </form>
  • 现在您可以看到,我们已经将模型指定为刚刚创建的 RegisterViewModel
  • 我们还将使用 ViewBag 设置此页面的标题,我们希望标题为 注册
  • 我们还需要创建一个包含用户名、密码和确认密码字段的表单。
  • 我们还包含了一个 div,它将显示验证摘要。当我们验证时,我们需要指定要在摘要中显示的错误。
  • 我们可以将所有错误显示在摘要区域中,模式为 ModelOnly,而在摘要中模型验证中出现的唯一错误将是与模型关联的验证错误,而不是该模型的特定属性。
  • 换句话说,如果用户没有填写用户名,但用户名是必需的,那么该特定属性将出现验证错误。
  • 但您也可以生成与特定属性无关的模型错误,这些错误将出现在验证摘要中。
  • <form> 标记中,我们有 ViewModel 中所有不同字段的标签和输入。标记中,我们有 ViewModel 中所有不同字段的标签和输入。
  • 我们需要用户名的标签、用户名的输入以及用户名的验证消息。
  • 我们需要用户输入的其他两个属性是相同的,将有一个标签和输入,以及一个用于 Password 的范围,还有一个标签、一个输入和一个用于 ConfirmPassword 的范围。
  • 我们不需要为 PasswordConfirmPassword 指定输入类型,因为 标签帮助 将确保将该输入类型设置为我们的密码。
  • 最后,我们需要有 注册 按钮。当用户单击此按钮时,我们会将表单提交回控制器。

AccountController 中,我们还需要实现 HttpPostRegister 操作方法。让我们回到 AccountController 并添加以下 Register 操作,如下所示:

  1. [HttpPost]
  2. public IActionResult Register (RegisterViewModel model) {
  3. }

此操作方法将返回 IActionResult。这将接收 RegisterViewModel。现在,我们需要与 Identity 框架交互,以确保用户有效,告诉 Identity 框架创建该用户,然后由于他们刚刚创建了帐户,请继续并登录。我们将在下一章中讨论实现所有这些步骤。