- ASP.NET Core 教程
- ASP.NET Core - 首页
- ASP.NET Core - 概述
- ASP.NET Core - 环境设置
- ASP.NET Core - 新建项目
- ASP.NET Core - 项目布局
- ASP.NET Core - project.json
- ASP.NET Core - 配置
- ASP.NET Core - 中间件
- ASP.NET Core - 异常处理
- ASP.NET Core - 静态文件
- ASP.NET Core - 设置 MVC
- ASP.NET Core - MVC 设计模式
- ASP.NET Core - 路由
- ASP.NET Core - 属性路由
- ASP.NET Core - Action 结果
- ASP.NET Core - 视图
- 设置 Entity Framework
- ASP.NET Core - DbContext
- ASP.NET Core - Razor 布局视图
- ASP.NET Core - Razor View Start
- ASP.NET Core - Razor View Import
- ASP.NET Core - Razor 标签助手
- ASP.NET Core - Razor 编辑表单
- ASP.NET Core - Identity 概述
- ASP.NET Core - Authorize 属性
- Identity 配置
- ASP.NET Core - Identity 迁移
- ASP.NET Core - 用户注册
- ASP.NET Core - 创建用户
- ASP.NET Core - 登录和注销
- ASP.NET Core 有用资源
- ASP.NET Core - 快速指南
- ASP.NET Core - 有用资源
- ASP.NET Core - 讨论
ASP.NET Core - 用户注册
本章将讨论用户注册。我们现在有一个可用的数据库,是时候开始向应用程序添加一些功能了。我们还配置了应用程序,并拥有一个可用的数据库模式。现在让我们转到应用程序主页。
按 F12 打开开发者工具,然后单击“编辑”链接。之前,当我们单击“编辑”链接时,MVC 框架检测到 Authorize 属性的存在并返回 401 状态代码,因为用户未登录。
您现在将看到我们在屏幕上收到了来自配置文件的消息。
现在让我们转到开发者工具。
您将看到浏览器请求了编辑页面,MVC 框架确定用户无权查看此资源。
因此,在 MVC 框架中的某个地方,生成了 401 状态代码。
我们现在已经安装了 Identity 中间件。Identity 中间件查看将要发送给用户的 401 状态代码,并将其替换为 302 状态代码,这是一个重定向状态代码。
Identity 框架知道用户必须先尝试登录才能访问此资源。
Identity 框架将我们定向到此 URL,如我们在地址栏中看到的——/Account/Login。
这是一个可配置的端点,位于 Identity 框架中,在注册这些服务和中间件时的 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 属性。
密码将是必需的,当我们为此密码呈现输入时,我们希望输入类型为 **密码类型**,以便字符不会显示在屏幕上。
**确认密码**也将是 DataType 密码,然后还有一个额外的 Compare 属性。我们将使用我们可以指定的另一个属性(即 Password 字段)来比较 ConfirmPassword 字段。
现在让我们创建所需的视图。我们需要向视图中添加一个新文件夹并将其命名为 Account,因此与 AccountController 相关的所有视图都将添加到此文件夹中。
现在,右键单击 Account 文件夹并选择添加→新建项。
在中间窗格中,选择 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 设置此页面的标题,并且我们希望标题为“注册”。
我们还需要创建一个包含用户名、密码和确认密码字段的表单。
我们还包含了一个将显示验证摘要的 div。当我们使用 ASP 验证摘要时,我们需要指定哪些错误将出现在摘要中。
我们可以让所有错误都出现在摘要区域中,或者我们可以说 ValidationSummary.ModelOnly,并且只有出现在模型验证中的摘要中的错误才是与模型相关的验证错误,而不是该模型的特定属性。
换句话说,如果用户没有填写他们的用户名,但用户名是必需的,那么将会有一个针对该特定属性的验证错误。
但您也可以生成与特定属性无关的模型错误,它们将出现在此 ValidationSummary 中。
在 <form> 标签内,我们为 ViewModel 中的所有不同字段都带有标签和输入。
我们需要用户名标签、用户名输入以及用户名验证消息。
我们需要用户输入的其他两个属性是相同的,它们将具有密码的标签、输入和跨度,以及确认密码的标签、输入和跨度。
我们不需要为密码和确认密码指定输入类型,因为 **asp** for 标签助手将确保为我们设置该输入类型为密码。
最后,我们需要一个显示 **注册** 的按钮。当用户单击此按钮时,我们将表单提交回控制器。
在 AccountController 中,我们还需要实现一个 HttpPost Register 操作方法。让我们返回 AccountController 并添加以下 Register 操作:
[HttpPost]
public IActionResult Register (RegisterViewModel model) {
}
此操作方法将返回 IActionResult。这将接收 RegisterViewModel。现在,我们需要与 Identity 框架进行交互以确保用户有效,告诉 Identity 框架创建该用户,然后因为他们刚刚创建了帐户,所以继续登录他们。我们将在下一章中讨论实现所有这些步骤。