原文:ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET Core 用户注册

上一章节我们终于迁移完了 Identity 的数据,也创建了用户表,现在,磨拳擦掌,是时候把注册功能给完善了。当然了,要实现登录功能得先有个用户,添加用户的方法很多,但是,我们还是先实现一个用户注册功能吧

本章节我们先来实现一个用户注册的功能,注册用户的 URL 为 /Account/Signup,也就是添加一个 AccountController 控制器,然后再实现一个 Signup 的动作方法,这也是为了以后匹配登录动作的 URL /Account/Login

  1. 首先在 Controllers 目录下新建一个 AccountController.cs 文件,创建方法和当初创建 AbountController.cs 一样

    创建完成后目录结构如下

    AccountController.cs 中的默认内容如下

    using System;
    namespace HelloWorld.Controllers
    {
    public class AccountController
    {
    public AccountController()
    {
    }
    }
    }
  2. 修改 AccountController.cs 引入命名空间 Microsoft.AspNetCore.Mvc,并让 AccountController 继承自该命名空间下的 Controller

    using System;
    using Microsoft.AspNetCore.Mvc; namespace HelloWorld.Controllers
    {
    public class AccountController: Controller
    {
    public AccountController()
    {
    }
    }
    }
  3. 然后在 AccountController 类中创建 Register 用来显示注册表单

    [HttpGet]
    public ViewResult Register() {
    return View();
    }
  4. 接下来在 Views 目录下创建目录 Account ,并在 Views/Account 目录下新建普通视图 Signup.cshtml

    创建完成后目录结构如下

    Signup.cshtml 中的默认内容如下

    @*
    For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
    *@
    @{
    }
  5. 再我们继续修改 Signup.cshtml 之前,我们先要确认一件事,就是注册的时候需要输入多少内容

    我们回到 SQLite Studio,看看我们的用户表有哪些字段

    可以看到几个熟悉的身影 UserNameEmailPasswordHash ,也就是说我们既可以使用用户名作为唯一标识,也可以使用邮箱作为唯一标识,两个都可以使用,也可以只用一个,我们这里就使用用户名吧

    于是,我们的注册表单就要用户输入三项内容 UserNamePassword,再加上确认命名 ConfirmPassword

  6. 好的,我们可以建模了,我们先创建一个模型 RegisterViewModel 来收集用户提交的信息

    我们把这个模型放在 AccountController.cs 文件中

    public class RegisterViewModel {
    [Required, MaxLength(64)]
    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; }
    }

    我们使用 C# 特性来帮助我们验证数据,当然多了几个新的面孔,比如 DataTypeCompare

    1. DataType 用于设置渲染成 HTML 时所使用的表单类型,再这里,就是 type="password"

    2. Compare 用于验证数据时指定和 Password 要一样

    当然了,为了使用这些 C# 特性,还需要引入命名空间 System.ComponentModel.DataAnnotations

  7. 修改完成后 AccountController.cs 中的内容如下

    using System;
    using Microsoft.AspNetCore.Mvc;
    using System.ComponentModel.DataAnnotations; namespace HelloWorld.Controllers
    {
    public class AccountController : Controller
    {
    public AccountController()
    {
    } [HttpGet]
    public ViewResult Signup()
    {
    return View();
    }
    } public class RegisterViewModel
    {
    [Required, MaxLength(64)]
    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; }
    }
    }
  8. 好了,有了这些数据我们就可以修改 Signup.cshtml

    @model RegisterViewModel
    @{
    ViewBag.Title = "注册用户";
    }
    <h1>注册用户</h1>
    <form asp-action="Signup" method="post">
    <div asp-validation-summary = "ModelOnly"></div>
    <div>
    <label asp-for="Username">用 户 名</label>
    <input asp-for="Username" />
    <span asp-validation-for="Username"></span>
    </div>
    <div>
    <label asp-for="Password">密 &nbsp;&nbsp;&nbsp;&nbsp;码</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="注册" />
    </div>
    </form>

    除了 <div asp-validation-summary = "ModelOnly"></div> 这个应该没啥新鲜的内容了

    asp-validation-summary 是一个 HTML 标签助手,用于输出所有的验证的错误信息的概要信息

    ModelOnly 是类 ValidationSummary 的一个成员,意思是只输出模型验证的错误信息

  9. 因为我们在注册表单中指定了使用 HTTP POST 方法把数据提交到 Signup 动作方法上,所以我们需要在 AccountController 里重载 Signup 动作方法

    [HttpPost]
    public IActionResult Signup(RegisterViewModel model)
    {
    return View();
    }

    这个动作方法将收到一个 RegisterViewModel 然后返回一个 IActionResult

    在这个方法中需要与 Identity 框架进行交互,以确保用户有效,告诉 Identity 框架创建该用户

    但这涉及到的内容实在太多,我们留给下一章节来填充,本章节我们留空就好

  10. 修改完成后,AccountController.cs 的全部内容如下

    using System;
    using Microsoft.AspNetCore.Mvc;
    using System.ComponentModel.DataAnnotations; namespace HelloWorld.Controllers
    {
    public class AccountController : Controller
    {
    public AccountController()
    {
    } [HttpGet]
    public ViewResult Signup()
    {
    return View();
    } [HttpPost]
    public IActionResult Signup(RegisterViewModel model)
    {
    return View();
    }
    } public class RegisterViewModel
    {
    [Required, MaxLength(64)]
    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; }
    }
    }
  11. 好了,我们回到 Index.cshtml 添加一个 注册新用户 的链接指向刚刚创建的 Account/Signup 地址

    @model HomePageViewModel
    @{
    ViewBag.Title = "职工列表";
    }
    <style>
    body {margin:10px auto;text-align:center}
    table {
    margin:0 auto;
    width:90% }
    table, th, td {
    border:1px solid #eee;
    border-collapse:collapse;
    border-spacing:0;
    padding:5px;
    text-align:center
    } .txt-left {
    text-align:left;
    }
    </style>
    <h1>职工列表</h1>
    <table>
    <tr>
    <td>ID</td>
    <td>姓名</td>
    <td class="txt-left">操作</td>
    </tr>
    @foreach (var employee in Model.Employees)
    {
    <tr>
    <td>@employee.ID</td>
    <td>@employee.Name</td>
    <td class="txt-left"><a asp-action="Detail" asp-route-Id="@employee.ID">详情</a> &nbsp; <a asp-controller="Home" asp-action="Edit"
    asp-route-id="@employee.ID">编辑</a></td>
    </tr>
    }
    </table>
    <br/>
    <p><a asp-action="Create" >新增员工</a></p>
    <hr/>
    <p><a asp-controller="Account" asp-action="Signup">注册新用户</a></p>

    asp-controller="Account" 用户指定链接的控制器名为 Account

好了,保存所有的代码,然后重启应用程序,访问首页,显示如下

点击 注册新用户 显示如下

如果我们不输入任何数据,直接点击 注册 按钮,则显示如下

如果输入完整的数据,点击 注册 则显示如下

ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程的更多相关文章

  1. 从头编写asp.net core 2.0 web api 基础框架 (5) + 使用Identity Server 4建立Authorization Server (7) 可运行前后台源码

    前台使用angular 5, 后台是asp.net core 2.0 web api + identity server 4. 从头编写asp.net core 2.0 web api 基础框架: 第 ...

  2. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

  3. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  4. ASP.NET Core 新增用户 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 新增用户 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 新增用户 上一章节我们实现了一个注册表单,但也留了一些东西还没完成, ...

  5. ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 迁移数据 上一章节中我们配置了 ...

  6. ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 配置 上一章节我们简单介绍了下 Id ...

  7. ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 验证特性 上一章节我们简单介绍了 ...

  8. ASP.NET Core Identity 框架 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 框架 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 框架 前面我们使用了 N 多个章节, ...

  9. ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...

随机推荐

  1. Giraph源代码分析(六)——Edge 分析

    HamaWhite 原创,转载请注明出处.欢迎大家增加Giraph 技术交流群: 228591158 欢迎訪问: 西北工业大学 - 大数据与知识管理研究室 (Northwestern Polytech ...

  2. LDAP Browser/Editor v2.8.2

    https://www.netiq.com/communities/cool-solutions/wp-content/uploads/sites/2/2009/07/Gawor_ldapbrowse ...

  3. putty-gns3

    hcl-cloud用的就是这个putty http://forum.gns3.net/topic5016.html File comment: Compiled PuTTY 0.62 for wind ...

  4. shell脚本if条件总结

    原文链接:https://geniuspeng.github.io/2018/03/12/shell-if/ shell编程中,if-then是一种常见的控制流命令,而if的条件判断一般采用内置命令t ...

  5. SocketChannel API用法

    java.nio.channels 类 SocketChannel java.lang.Object java.nio.channels.spi.AbstractInterruptibleChanne ...

  6. 使用oschina的gitserver

    1.概要 事实上oschina的gitserver与github的几乎相同.只是既然是中国的gitserver,那么速度应该更快一些吧 2.注冊 链接https://git.oschina.net/, ...

  7. 在线生成 QR Code

    http://tool.oschina.net/qr 在线生成二维码(QR码)-采用ZXing与d-project

  8. [Win 8/WP 8]简单实现弹出页更换头像的功能

    在Win 8应用里,对弹出页(Popup)的灵活操作必不可少,下面我们就来简单实现一个. 一.先让Popup弹出到指定位置 先来看看效果图,如图[1]: 下面是前端代码,代码段[1]: <Gri ...

  9. 【u017】请柬

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院, ...

  10. JFinal redis cluster集群插件

    JFinal redis cluster集群插件 JFinal 框架到了2.1版本号,可是依旧仅仅支持redis的主从集群,没有看到Cluster集群的插件.笔者照着主从的插件方式,改了改,实现了个简 ...