ASP.NET Core 用户注册
在本章中,我们将讨论用户注册。我们现在有了一个数据库,是时候开始向应用程序添加一些功能了。我们还配置了我们的应用程序,我们有一个工作的数据库模式。现在让我们进入应用程序主页。
我们把之前做的页面搬过来后如下:
这时,我们可以按下 F12,打开控制台,观察网络(Network),然后点击 Edit。
- 您将看到浏览器请求编辑页面,MVC 框架决定用户无权查看此资源。
- 现在,身份中间件已经就位。Identity 中间件查看将发送给用户的 302 状态代码,这是一个重定向状态代码。
- Identity 框架知道用户必须尝试登录才能访问此资源。
- Identity 框架将我们引向这个 URL,我们可以在地址栏- /Account/Login 中看到。
- 当您注册这些服务和中间件时,这是一个带有 Identity 框架的可配置端点,位于 Startup 内部。您可以设置不同的选项,其中一个选项是更改登录 URL。
- 默认情况下,URL 将为 /Account/Login。目前,我们没有帐户控制器,所以最终我们要做的是创建帐户控制器并允许用户登录。
- 但在用户登录之前,他们需要在网站上注册并保存用户名和密码。
- 登录和注册功能都可以是帐户控制器的一部分。
现在让我们继续,在 Controllers 文件夹中添加一个新类,并将其称为 AccountController。我们将从 MVC 框架的基础 Controller
类中派生出这一点。
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;
namespace MyCoreWeb.Controllers
{
public class AccountController : Controller
{
public IActionResult Index()
{
return View();
}
}
}
- 我们现在必须设置一个注册功能,让用户可以注册该网站。
- 就像一个编辑表单。
- 当用户想要注册时,我们将首先显示一个表单,允许他们填写所需信息。然后,他们可以将此表单上传到网站。
- 然后将此信息保存在数据库中。
因此将上述代码修改为:
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;
namespace MyCoreWeb.Controllers
{
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
属性。 - 将需要密码,当我们为该密码呈现输入时,我们希望输入类型为
DataType.Password
,以便字符不会显示在屏幕上。 - 确认密码也将是
DataType.Password
,然后还有一个额外的Compare
属性。我们将把ConfirmPassword
字段与我们可以指定的另一个属性(即Password
字段)进行比较。
现在让我们创建所需的视图。我们需要向视图中添加一个新文件夹,并将其称为 Account,因此与 AccountController
相关的所有视图都将添加到此文件夹中。
现在右击 Account 文件夹,添加一个新视图,命名为 Register
Register 的代码如下:
@model RegisterViewModel
@{
ViewBag.Title = "注册";
}
<h1>Register</h1>
<form method="post" asp-controller="Account" asp-action="Register">
<div asp-validation-summary="ModelOnly"></div>
<div>
<label>用户名</label>
<input asp-for="Username" />
<span asp-validation-for="Username"></span>
</div>
<div>
<label>密码</label>
<input asp-for="Password" />
<span asp-validation-for="Password"></span>
</div>
<div>
<label>确认密码</label>
<input asp-for="ConfirmPassword" />
<span asp-validation-for="ConfirmPassword"></span>
</div>
<div>
<input type="submit" value="注册" />
</div>
</form>
- 现在您可以看到,我们已经将模型指定为刚刚创建的
RegisterViewModel
。 - 我们还将使用 ViewBag 设置此页面的标题,我们希望标题为 注册。
- 我们还需要创建一个包含用户名、密码和确认密码字段的表单。
- 我们还包含了一个 div,它将显示验证摘要。当我们验证时,我们需要指定要在摘要中显示的错误。
- 我们可以将所有错误显示在摘要区域中,模式为
ModelOnly
,而在摘要中模型验证中出现的唯一错误将是与模型关联的验证错误,而不是该模型的特定属性。 - 换句话说,如果用户没有填写用户名,但用户名是必需的,那么该特定属性将出现验证错误。
- 但您也可以生成与特定属性无关的模型错误,这些错误将出现在验证摘要中。
- 在 <form> 标记中,我们有 ViewModel 中所有不同字段的标签和输入。标记中,我们有 ViewModel 中所有不同字段的标签和输入。
- 我们需要用户名的标签、用户名的输入以及用户名的验证消息。
- 我们需要用户输入的其他两个属性是相同的,将有一个标签和输入,以及一个用于
Password
的范围,还有一个标签、一个输入和一个用于ConfirmPassword
的范围。 - 我们不需要为
Password
和ConfirmPassword
指定输入类型,因为 标签帮助 将确保将该输入类型设置为我们的密码。 - 最后,我们需要有 注册 按钮。当用户单击此按钮时,我们会将表单提交回控制器。
在 AccountController 中,我们还需要实现 HttpPost 的 Register
操作方法。让我们回到 AccountController 并添加以下 Register 操作,如下所示:
[HttpPost]
public IActionResult Register (RegisterViewModel model) {
}
此操作方法将返回 IActionResult。这将接收 RegisterViewModel
。现在,我们需要与 Identity 框架交互,以确保用户有效,告诉 Identity 框架创建该用户,然后由于他们刚刚创建了帐户,请继续并登录。我们将在下一章中讨论实现所有这些步骤。