ASP.NET Core - 用户注册


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

用户注册

按 F12 打开开发人员工具,然后单击“编辑”链接。以前,当我们单击“编辑”链接时,MVC 框架会检测到 Authorize 属性的存在,并返回 401 状态代码,因为用户尚未登录。

开发者工具

您现在将看到我们在屏幕上从配置文件中收到一条消息。

现在让我们进入开发者工具。

开发者工具网络
  • 您将看到浏览器请求编辑页面,并且 MVC 框架决定用户无权查看此资源。

  • 因此,MVC 框架内部的某个地方生成了 401 状态代码。

  • 我们现在已经有了身份中间件。身份中间件查看将发送给用户的 401 状态代码,并将其替换为 302 状态代码,这是一个重定向状态代码。

  • 身份框架知道用户必须尝试登录才能访问此资源。

  • 身份框架将我们定向到此 URL,正如我们在地址栏中看到的那样 — /Account/Login。

  • 这是一个带有身份框架的可配置端点,当您注册这些服务和中间件时,位于 Startup 内部。您可以设置不同的选项,其中之一是更改登录 URL。

  • 默认情况下,URL 为 /Account/Login。目前,我们没有帐户控制器,因此最终我们想要做的是创建帐户控制器并允许用户登录。

  • 但在用户登录之前,他们需要在网站上注册并保存他们的用户名和密码。

  • 登录和注册功能都可以是帐户控制器的一部分。

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

using Microsoft.AspNet.Mvc; 

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations;
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppDemo.Controllers { 
   public class AccountController : Controller {  
   } 
} 
  • 我们现在必须设置一个功能,让用户可以注册该网站。

  • 它非常类似于编辑表单。

  • 当用户想要注册时,我们将首先显示一个表单,让他们填写所需的信息。然后他们可以将此表格上传到网站。

  • 然后该信息被保存在数据库中。

现在让我们创建一个操作,当我们转到 /account/register 时将返回一个视图。

public class AccountController : Controller { 
   [HttpGet] 
   public ViewResult Register() { 
      return View(); 
   } 
}

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

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

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

public class RegisterViewModel { 
   [Required, MaxLength(256)] 
   public string Username { get; set; }  
   
   [Required, DataType(DataType.Password)] 
   public string Password { get; set; }  
   
   [DataType(DataType.Password), Compare(nameof(Password))] 
   public string ConfirmPassword { get; set; } 
}

在上面的类中,您可以看到一些注释可以帮助我们验证这个模型。这里需要用户名,如果您查看数据库架构,会发现保存用户名的列有 256 个字符长。

用户名
  • 我们还将在这里应用 MaxLength 属性。

  • 将需要密码,当我们呈现此密码的输入时,我们希望输入类型为密码类型,以便字符不会显示在屏幕上。

  • 确认密码也将是数据类型密码,然后还有一个附加的比较属性。我们将比较“ConfirmPassword”字段与我们可以指定的另一个属性,即“Password”字段。

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

账户控制器

现在,右键单击“帐户”文件夹并选择“添加”→“新项目”。

MVC视图页面

在中间窗格中,选择 MVC 视图页面并将其命名为 Register.cshtml,然后单击“添加”按钮。

从 Register.cshtml 文件中删除所有现有代码并添加以下代码。

@model RegisterViewModel 
@{ 
   ViewBag.Title = "Register"; 
}  
<h1>Register</h1> 

<form method = "post" asp-controller = "Account" asp-action = "Register"> 
   <div asp-validation-summary = "ValidationSummary.ModelOnly"></div> 
   
   <div> 
      <label asp-for = "Username"></label> 
      <input asp-for = "Username" /> 
      <span asp-validation-for = "Username"></span> 
    </div> 
   
   <div> 
      <label asp-for = "Password"></label> 
      <input asp-for = "Password" /> 
      <span asp-validation-for = "Password"></span> 
   </div> 
   
   <div> 
      <label asp-for = "ConfirmPassword"></label> 
      <input asp-for = "ConfirmPassword" /> 
      <span asp-validation-for = "ConfirmPassword"></span> 
   </div> 
    
   <div> 
      <input type = "submit" value = "Register" /> 
   </div> 

</form>
  • 您现在可以看到我们已将模型指定为刚刚创建的 RegisterViewModel。

  • 我们还将使用 ViewBag 设置此页面的标题,我们希望标题为 Register。

  • 我们还需要创建一个包含用户名、密码和确认密码字段的表单。

  • 我们还包含了一个将显示验证摘要的 div。当我们使用 ASP 验证摘要时,我们需要指定摘要中出现哪些错误。

  • 我们可以让所有错误出现在摘要区域中,或者我们可以说 ValidationSummary.ModelOnly,摘要内的模型验证中出现的唯一错误将是与模型关联的验证错误,而不是模型的特定属性那个型号。

  • 换句话说,如果用户没有填写用户名,但用户名是必需的,则该特定属性将会出现验证错误。

  • 但您也可以生成与特定属性无关的模型错误,它们将出现在此 ValidationSummary 中。

  • 在 <form> 标签内,我们有 ViewModel 中所有不同字段的标签和输入。

  • 我们需要用户名的标签、用户名的输入以及用户名的验证消息。

  • 我们需要用户输入的其他两个属性是相同的,它们将具有一个标签和输入以及一个用于密码的范围以及一个标签和一个输入以及一个用于确认密码的范围。

  • 我们不需要指定Password 和ConfirmPassword 的输入类型,因为asp for tag helper 将确保将该输入类型设置为我们的密码。

  • 最后,我们需要有“Register”按钮。当用户单击此按钮时,我们会将表单提交回控制器。

在AccountController中,我们还需要实现一个HttpPost Register操作方法。让我们回到 AccountController 并添加以下 Register 操作,如下所示 -

[HttpPost] 
public IActionResult Register (RegisterViewModel model) {  
}

此操作方法将返回 IActionResult。这将收到一个 RegisterViewModel。现在,我们需要与身份框架交互,以确保用户有效,告诉身份框架创建该用户,然后因为他们刚刚创建了帐户,所以继续登录。我们将看看在下一章中实施所有这些步骤。